Quantcast
Channel: Cadence Custom IC Skill Forum
Viewing all 5076 articles
Browse latest View live

dump all the layer from Palette Assistant window in case of no LSW layer definitions in the specified technology database

$
0
0

Any ideas from skill?

[Please visit the site to access the poll]


SKILL descend into a component sub-circuit schematic

$
0
0

Dear all,

I'm currently working on a impedance matching tool that will be run using Cadence SKILL and OCEAN and have stumbled upon a small problem.

I'd like to do the following:

1) Open an existing schematic that has components inside. Each of the components have sub-circuits inside, but they are not parametric cells.

2) Descend into a particular component and change the value of a component which is inside the sub-circuit parameter.

In other words I have a top level schematic A that has a component B. And I want to access component C parameters which is a sub-circuit inside of a component B in the top level schematic A.

I know how to open a schematic, find and change the parameters of an existing component (in this case it is component "Cpad1" in a schematic "ind_lossy" in a library LIB_NAME):

    cvIdTemp = dbOpenCellViewByType(LIB_NAME "ind_lossy" "schematic")
    dbReopen(cvIdTemp "a") ;to remove locked status of the opened cell view
    
    instanceSelection= dbFindAnyInstByName(cvIdTemp "Cpad1")
    
    instanceSelection~>c = 123e-12
    dbSave(cvIdTemp)
    dbClose(cvIdTemp)

I was wondering - how would one descend into a component sub-circuit schematic and change parameters inside using SKILL, save and close both the sub-circuit and the top schematic?

Thanks,

Aleksandr

Align pins based on connectivity

$
0
0

Hi,

I'm looking for a function which can align pins to objects with similar net name. For example say I have an instance and pins only in layout. Now I want to place pins directly over the instance's pins.  In Edit->Advanced->Align there is an option to do this but I get the following error.

*WARNING* (LX-3009): Cannot run pin alignment because there are no pin pairs to be aligned.

Can somebody help me? I'm using virtuoso version ICADV12.2-64b 04/13/2016 08:41

-Ramakrishnan

Arguments in geOpen()

$
0
0

Hi,

its showing an error for geOpen() with some arguments as missing, even after i specifed the every argument.

geOpen(w_Window, library, cell, "schematic" "schematic" "r"),

where i specified my window as w_window = hiOpenWindow(), library is library am using, cell is cell View and r is mode.

Thanks.

w_window = hiOpenWindow()
w_window = hiOpenWindow()

lxCheck but with useful return?

$
0
0

Is there any way to run an XL Compliance check that returns the result in a form that could be used by a skill program?  For example one use is to write a program that checked each layout view in a library and created a web page with a XL compliance table.  lxCheck  just causes stuff to get written to CDS.log.  I guess I could use some horrible hack like

printf("XL_CHECK_START\n")

lxCheck(cv)

printf("XL_CHECK_STOP"\n")

and then try to parse that out of the CDS.log, but wow, that is a hack.

multi-technology simulation netlisting through command line.

$
0
0

Hi, All, I am doing top level mixed-signal multi-technology simulation (MTS).  To generate a mutli-technology analog netlist, I need to start ADE XL GUI, config it into MTS mode, and generate netlist through GUI. Wondering whether there is a way to generate the MTS netlist through command line?  Like:

bsub -I virtuoso -nograph +(arguments to invoke ADE XL and generate the netlist)

Thanks a lot for helping!

Trying to generate abstract using absAbstract() command

$
0
0

Hi All,

I executed below steps in CIW.  I am using Virtuoso 6.1.6 version. My main aim is to generate lef from layout without any GUI windows. 

absSkillMode()

absSetLibrary("venu")

absSelCell("INV")

absPins()

But I am not getting any output view from above commands in my library . Could you please help me ?

Thank you,

Venu

when is .cdsinit.local loaded?

$
0
0

I have a questions on .cdsinit.local file

I did some customization (bindkeys etc.) in .cdsinit.local file and I put the file in my cadence working directory.

When I start cadence, when is .cdsinit.local loaded?

What I found is that some of the customization gets overwritten by scripts loaded later from the project/company environment. As a results, I have to load again my bindkeys after cadence fully starts.

Is there a way to put .cdsinit.local at the end of the list of files loaded when cadence starts, so that it won't get overwritten?

Or is there a way to use the pop up window (like the what's new window)  to trigger the loading of some skill code?

Thanks! 


SKILL pPar error during CDF parameter handling

$
0
0

Hi all,

I'm trying to pass parameters from the top level schematic to a lower level schematic.

The schematic and CDF parameters are generated without problems, but when I try to modify the value of existing schematic components (in this case only inductor is present) and insert pPar("__CDFparName__"), I get an error which says that pPar is an undefined function. Both schematic and symbol are created using dbOpenCellViewByType. The procedure is presented below:

procedure( pcellTestProc(LIB_NAME CELL_NAME VIEW_NAME )
 let((params cellId cdfId cvSchem)
 
    cvSchem = dbOpenCellViewByType(LIB_NAME CELL_NAME "schematic" "schematic" "w")    
    dbReopen(cvSchem "a")
 
    unless( cellId = ddGetObj( LIB_NAME CELL_NAME )
        error( "Could not get cell %s." CELL_NAME )
    )
        when( cdfId = cdfGetBaseCellCDF( cellId )
        cdfDeleteCDF( cdfId )
    )

    ; insert inductor "ind" from library "analogLib"
    params = insertInstance(LIB_NAME CELL_NAME VIEW_NAME "analogLib" "ind" "symbol" "Lpkg" 1 0:0 1:0 "R90")
   
    cdfId = cdfCreateBaseCellCDF( cellId )
    ; Parameters for the
    cdfCreateParam( cdfId
        ?name "extParamL"
        ?prompt "inductance"
        ?defValue ""
        ?type "string"
        ?display ""
        ?parseAsCEL "yes"
    )
 
    cdfSaveCDF( cdfId )

   ; change  value

    params~>l = pPar("model") ;<------------------------ HERE'S WHERE I GET AN ERROR: *Error* eval: undefined function - pPar
    dbSave(cvSchem)
    dbClose(cvSchem)    
 );let
);procedure

How are pPar values passed on to the exiting component parameters via SKILL, where did I go wrong with my approach?


Thanks,

Aleksandr

Dimming on layout window any given area?

$
0
0

Hi Andrew,

    Thanks actively helping us.

I have question like this, we can do "dimming" on layout windows, through display options.

We can do dimming based for conditions ie scope. However is there any chance for dimming on layout window with given list of  coordinates?

Example, I would like to dimm the layout window from (X1,Y1) to (X2,Y2). Layout should be in read mode and nothing is selected.

Regards,

Venkatraman

toolbar, dockable, and actions

$
0
0

I have several questions related to assistants, toolbars, and actions.

1)  I've figured out how to create a toolbar and also a dockable window.   Is there a way to add those to the list of choices I see when I right click to the right of the "Help" menu choice in virtuoso?  I get the normal popup with choices "assistants" and "toolbars".

2) I have some code which generates a toolbar that has a "category" combo box and then based on which category is picked the toolbar gets populated with a bunch of actions.  This seems to be working as desired.  In the callback for that combo, I use hiDeleteToolBarItem to remove the old list of actions and hiAddToolbarItems add the new ones. 

Unfortunately, I think that is is actually a dockable window I ultimately want instead of a toolbar because I wanted to have a tab for it like my other docked assistants (Palette, Navigator, Annotation Browser).  I tried adding the toolbar to a dockable window I created but it is pretty easy to accidentally drag the toolbar out of that dockable window and then I can't get it to stick back in so I think that isn't really the right approach.

Should I be using my actions (created with hiCreateAction) and adding them to a fixed menu that I put in the dockable window?

In case someone else is looking for code samples:

;; creating a simple dockable window

formId = hiCreateAppForm(
   ?name 'myAppForm
   ?fields list(
      hiCreateLabel( ?name 'label1 ?labelText "My Label" )
      hiCreateButton(?name 'button1 ?buttonText "My Button" ?callback "printf(\"button 1 callback\n\")") 
      hiCreateComboField(?name 'combo1 ?prompt "My Combo" ?items list("choice1" "choice2" "choice2"))
   )
)
winId = hiCreateDockWindow(
   ?appType "layout"
   ?widgetType "form"
   ?handle 'myDockWin
   ?form formId
   ?scrollBar t
   ?title "My Dock Window"
)
mainSession = getCurrentWindow()->sessionWindow
hiDockWindow(?window winId ?session mainSession ?side 'left)

;; How to cause the dockable window to be tabbed like my other assistants (like Navigator, Palette, and Annotation Browser) already are?

;; how to add to the list of assistants in the popup menu that shows other assistants?  Or do I just need to add something to a custom pulldown menu that is added to the banner that toggles my dockable window mapped/unmapped

 

;; create some actions

act1 = hiCreateAction(?name 'act1 ?iconText "Action 1" ?callback "printf(\"action 1\n\")")

act2 = hiCreateAction(?name 'act2 ?iconText "Action 2" ?callback "printf(\"action 2\n\")")

 

;; create a toolbar

toolbar = hiCreateToolbar(?name 'mytoolbar ?title "My Toolbar" ?toolButtonStyle 'textOnly)

hiAddToolbarItem(toolbar, act1)

hiAddToolbarItem(toolbar, act2)

w=getCurrentWindow()

hiPlaceToolbar(w, toolbar, 'left)

;; how to add to the popup menu list of toolbars?

 

;; can my actions be placed into the form in the dockable window instead of a toolbar?

 



simple skill widgets and dbLayerAnd()

$
0
0

I discovered that it's pretty easy to make interconnections on shapes of wires , especially for example , grids of power wires , when they are part of a list of shapes. 

So I make two lists, one of the lower level metal , the other the upper layer, I then "dblayerAnd()" them together with the format of (cv "vialayer" list1 list2)

but my problem is the vialayer parameter produces mostly rectangles where the AND is satisfied , I then have to use another program to transfer the

resultant rectangles centerBox into the xy coords of an actual via instance - isn't there a way to shortcut this ?  Would I instead of using "vialayer"

make something like dbLayerAnd(cv dbCreateVia(cv techGetTechFile(viaID) centerBox(andArea) "R0" ) ??

thanks.

PCell callbacks and cdfgData variable

$
0
0

I want to execute the callback from a cell(pcell) after instantiation it to a layout, in order to check if chosen parameters are correct (no callback validation). 

evalstring(callbackOfPcell)

and it always returns t, even for the obviously mistaken setup for the inst. parameters. 

I've checked the source code of the "callbackOfPcell" callback function, and for getting the value from the cell it's using the cdfgData variable. The documentation and internet didn't give me an answer how cdfgData knows which cell is under test now.

So, the question is how cdfgData gets the right value for a cell, and why it has nil value after executing it in the CIW.

disabling local simulation in ADE

$
0
0

Dear Community Users,

We are looking for a way to disable local simulation in ADE or just hide the option to select it from users:

a CIW way is to get session id and then hide it:
session_id~>data~>sevSession~>simulatorForm~>hostMode~>invisible=t

We want to disable it from a central location so that no user can submit local simulation.  Could you please guide us on this ?

Best Regards

IC61x waveform viewer commands not as versatile as in IC15

$
0
0

Hi all,

just wondering, is it me, or is IC615 and IC616 waveform tools don't seem to always perform in OCEAN/SKILL scripts?

During the old days of IC5 I could do everything to get quality plots (place all types of markers exactly where you want, change window size, background color, open/close windows and subwindows and they physically opened and closed) and hardcopy them with SKILL/OCEAN commands.

The most usual plot operations I'd like to conduct are:

1) Resize the picture;

2) Place markers where I want;

3) Control all possible sidebars in the window (IC6 has an annoying sidebar which you can remove by default during the initial ICFB loading, but haven't found a way to remove it if it is there in the first place)

4) Close all windows or subwindows that are of no use when they are processed

5) Hardcopy - this is the only thing that works as intended from the above list.

Here's the code I'm executing. Everything works fine, I get the pictures, but:

            awvCreatePlotWindow( ?bBox list( 0:0 1200:1200 ) )  ; Open a window - ok, this works
            currentWindow = awvGetCurrentWindow() ; get the window ID, no problem here
            awvResizeWindow(currentWindow list(200:200 3000:3000))  ; resizeing does nothing, tried to type in different values
            currentSubwindow = awvGetCurrentSubwindow(currentWindow) ; get the subwindow ID, no problem here
            
            plot( S11_dB20 ?expr '( "S11 dB20" ) ) ; plot my curve
            awvDisplayDate( currentWindow ) ;place additional info
            awvPlaceXMarker( currentWindow S11_neg10dBhigh)
            awvPlaceXMarker( currentWindow S11_neg10dBlow); the markers are placed, but the value seems to be there only for the last marker. In IC5 OCEAN/SKILL you could place markers wherever you want and how you wanted and all values were displayed...
            hardCopyOptions(?hcOutputFile strcat(scriptLog_destination_path MN_CELL_NAME_ARRAY_ELEMENT ".png")) ; this one works
            hardCopy() ; new alternative saveGraphImage()
            deleteSubwindow() ; the picture in the subwindow is deleted, but the subwindow is there in the window. Why? Can you remove the subwindow in the same manner as pressing X???
            awvDeleteSubwindow( currentWindow ?subwindow currentSubwindow ) ; this doesn't close the subwindow physically either
            vvCloseWindow("unbound" currentSubwindow) ; tried to emulate the command that pops up in ICFB when you press X in the subwindow - nothing happens
            hiCloseWindow( currentWindow )   ; the window doesn't close physically. IC5 had no issues physically closing the window...

  But the funny thing is, when I close the window manually with all presumably closed subwindows within my script, ICFB says that all the windows shouldn't be there in the first place as they are closed (but the window with subwindows is still there on my desktop, even though all subwindow contents are blank):

*WARNING* Window 255 does not exist
*WARNING* Window 257 does not exist
*WARNING* Window 259 does not exist
*WARNING* Window 261 does not exist
*WARNING* Window 263 does not exist
*WARNING* Window 265 does not exist
*WARNING* Window 267 does not exist
*WARNING* Window 269 does not exist
*WARNING* Window 271 does not exist
*WARNING* Window 273 does not exist
*WARNING* Window 275 does not exist
*WARNING* Window 277 does not exist
*WARNING* Window 279 does not exist
*WARNING* Window 281 does not exist
*WARNING* Window 283 does not exist
*WARNING* Window 285 does not exist
*WARNING* Window 287 does not exist
*WARNING* Window 289 does not exist
*WARNING* Window 291 does not exist
*WARNING* Window 293 does not exist
*WARNING* Window 295 does not exist
*WARNING* Window 297 does not exist
*WARNING* Window 299 does not exist

Any suggestions on general window handling in IC6? I guess that migrating to the new waveform viewer makes it a bit unusable within custom SKILL/OCEAN scripts, in other words - it works not as clean as the old IC5 waveform viewer did... But it will be great if I'm proven wrong.

Regards,

Aleksandr


Checking against text from a file

$
0
0

Hi All,

I have a file i want to read.  This file consists of lines like

RUN DRC YES

RUN LVS YES

POWER NAMES VCC VCCA

i have some outputs of Buttons and stringFields from a GUI that i set to a string like

setPowerNames = sprintf(str "POWER NAMES %s" powerStringField~>value)

if(drcBooleanButton = t

then

setDrcSwitch = "RUN DRC YES"

else

setDRCSwitch = "RUN DRC NO"

)

I want to then compare all the lines from the file against setPowerNames,setDrcSwitch, etc.  Then i would ouput the lines that are different from the file to an output file(compare.results.text)

What would be the most efficient way to do this?

Thank you in advance for your help. 

Getting the time point in the calculation

$
0
0

hello all.
I am looking to create a waveform. How do I use the x point value as a point?
I.e.:
wave(time) = average( VT(net1) time )

Skill Code Need to Toggle Path or Path Segment Width

$
0
0

Hi,

I need a skill code in which I can toggle the path or path segment width from list(0.1, 0.15, 0.2, 0.3) and when the metal width is 0.3 then it will loop back to 0.1.  I have the following script it only changes the metal width to 0.15 but does not have the toggle function.

procedure(toggleWidth()
 foreach(obj geGetSelectedSet()
  if(obj~>width=0.1 then
     obj~>width=0.15
  )
 )
)

Thanks,

EW

SKILL function to read notes

$
0
0

Hi,

It is SKILL functions to set notes for history item, test, variable etc. But i didn't found function to read notes. So how can i read note from test using SKILL?

Thank you.

SKILL pCell STREAM OUT failure

$
0
0

Hello,

A pCell fails during stream out stage.

(unsupported XStream function in Pcell SKILL)

All functions behaves normal during testing and are taken from previous Cadence development. The pCell also fails manual stream out procedure.

Thanks for your help...

Danny

-----------------------------------------------------------------------------------------------


procedure(CCScreateBoxAndLabels(cv w l lay)
  let( (rectRodObj)
  ;; create a rectangle on metal1 with x & y dimensions set by w & l
  rectRodObj = rodCreateRect(
      ?name     "myRect"
      ?cvId     cv
      ?layer    lay ; list("Metal1" "drawing")
      ?width    w
      ?length   l
      ?origin   list(0 0)
  )
  ;; create labels to show the w and l parameters
  dbCreateLabel(cv list("text" "drawing") list(0 0)
    sprintf(nil "%2.8f" w) "lowerLeft" "R0" "stick" 0.05)
  dbCreateLabel(cv list("text" "drawing") list(0 0.2)
    sprintf(nil "%2.8f" l) "lowerLeft" "R0" "stick" 0.05)
  ;; create a stretch handle for the width, in the X dimension, it
  ;; will display as "width = <value>" and change by 0.1 increments
  rodAssignHandleToParameter(
    ?parameter          "w"
    ?rodObj             rectRodObj
    ?handleName         "centerRight"
    ?stretchDir         "X"
    ?displayName        "width"
    ?displayExpression  "w"
    ?updateIncrement    0.1
  ); rodAssignHandleToParameter
  ); let
); procedure CCScreateBoxAndLabels


procedure(createDRBox(cv w l lay objName orig)
  let( (rectRodObj)
  ;; create a rectangle on metal1 with x & y dimensions set by w & l
  rectRodObj = rodCreateRect(
      ?name     objName
      ?cvId     cv
      ?layer    lay
      ?width    M1w
      ?length   M1l
      ?origin   orig
  )
  ;; create a stretch handle for the width, in the X dimension, it
  ;; will display as "width = <value>" and change by 0.1 increments
  rodAssignHandleToParameter(
    ?parameter          "w"
    ?rodObj             rectRodObj
    ?handleName         "centerRight"
    ?stretchDir         "X"
    ?displayName        "width"
    ?displayExpression  "w"
    ?updateIncrement    0.1
  ); rodAssignHandleToParameter

  ); let
); procedure


procedure(placeContactsNP(Width Length)

prog( (i j)

i=0
j=0.060

x=1.070
y=1.070

;----------------
; Bottom Part
;----------------
; First Row
while( x < Width-1.070
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
x=x+0.185
) ;while

; Second Row
x=1.370
y=1.370
while( x < Width-1.370
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
x=x+0.185
) ;while

; Third Row
x=1.670
y=1.670
while( x < Width-1.670
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
x=x+0.185
) ;while

; Fourth Row
x=1.970
y=1.970
while( x < Width-1.970
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
x=x+0.185
) ;while

; Fifth Row
x=2.270
y=2.270
while( x < Width-2.270
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
x=x+0.185
) ;while



;----------------
; Top Part
;----------------
; First Row
x=1.255
y=l-1.070
while( x < Width-1.255
dbCreateRect(cv list("CO" "drawing") list((x:y) (x-j:y-j)))
x=x+0.185
) ;while

; Second Row
x=1.555
y=l-1.370
while( x < Width-1.555
dbCreateRect(cv list("CO" "drawing") list((x:y) (x-j:y-j)))
x=x+0.185
) ;while

; Third Row
x=1.855
y=l-1.670
while( x < Width-1.855
dbCreateRect(cv list("CO" "drawing") list((x:y) (x-j:y-j)))
x=x+0.185
) ;while


; Fourth Row
x=2.155
y=l-1.970
while( x < Width-2.155
dbCreateRect(cv list("CO" "drawing") list((x:y) (x-j:y-j)))
x=x+0.185
) ;while

; Fifth Row
x=2.455
y=l-2.270
while( x < Width-2.455
dbCreateRect(cv list("CO" "drawing") list((x:y) (x-j:y-j)))
x=x+0.185
) ;while



;----------------
; Left Part
;----------------
; First Row
x=1.070
y=1.255
while( y < Length-1.255
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
y=y+0.185
) ;while

; Second Row
x=1.370
y=1.550
while( y < Length-1.550
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
y=y+0.185
) ;while

; Third Row
x=1.670
y=1.855
while( y < Length-1.855
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
y=y+0.185
) ;while

; Fourth Row
x=1.970
y=2.155
while( y < Length-2.155
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
y=y+0.185
) ;while

; Fifth Row
x=2.270
y=2.455
while( y < Length-2.455
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
y=y+0.185
) ;while



;----------------
;  Right Part
;----------------
; First Row
x=w-1.070
y=1.312
while( y < Length-1.312
dbCreateRect(cv list("CO" "drawing") list((x:y) (x-j:y-j)))
y=y+0.185
) ;while

; Second Row
x=w-1.370
y=1.610
while( y < Length-1.610
dbCreateRect(cv list("CO" "drawing") list((x:y) (x-j:y-j)))
y=y+0.185
) ;while


; Third Row
x=w-1.670
y=1.915
while( y < Length-1.915
dbCreateRect(cv list("CO" "drawing") list((x:y) (x-j:y-j)))
y=y+0.185
) ;while

; Fourth Row
x=w-1.970
y=2.215
while( y < Length-2.215
dbCreateRect(cv list("CO" "drawing") list((x:y) (x-j:y-j)))
y=y+0.185
) ;while

; Fifth Row
x=w-2.270
y=2.515
while( y < Length-2.515
dbCreateRect(cv list("CO" "drawing") list((x:y) (x-j:y-j)))
y=y+0.185
) ;while



) ;prog

);proc



procedure(placeContactsPP(Width Length)

prog( (i j)

i=0
j=0.060

x=-1.325
y=-1.325

;----------------
; Bottom Part
;----------------
; First Row
while( x < Width+1.380
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
x=x+0.185
) ;while
; Second Row
x=-1.325
y=-1.165

while( x < Width+1.38
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
x=x+0.185
) ;while


;----------------
; Top Part
;----------------
; First Row
x=-1.325
y=l+1.105

while( x < Width+1.380
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
x=x+0.185
) ;while
; Second Row
x=-1.325
y=l+1.265

while( x < Width+1.380
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
x=x+0.185
) ;while


;----------------
; Left Part
;----------------
; First Row
x=-1.325
y=-.950

while( y < Length+0.950
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
y=y+0.185
) ;while

; Second Row
x=-1.165
y=-.950

while( y < Length+0.950
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
y=y+0.185
) ;while

;----------------
;  Right Part
;----------------
; First Row
x=w+1.105
y=-0.950

while( y < Length+0.950
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
y=y+0.185
) ;while

; Second Row
x=w+1.265
y=-0.950

while( y < Length+0.950
dbCreateRect(cv list("CO" "drawing") list((x:y) (x+j:y+j)))
y=y+0.185
) ;while


) ;prog

);proc





;; Create the PCell, the "drawing routine"
;;  
pcDefinePCell(
  list(ddGetObj("testLibDR") "isolationRing" "layout")
  (
    (w 10.0)
    (l 10.0)
;    (Hl 5.0)
;    (Hw 5.0)
;    (He 1.0)
  )
  let( ((cv pcCellView))
    ; Create the FLASH
    dbCreateRect(cv list("FLASH" "drawing") list((0:0) (w:3.4)))

    ; Create the DNW over the FLASH
    dbCreateRect(cv list("DNW" "drawing") list((0:0) (w:l)))

    ; NP Isolation Ring
    ;==================
    ; NP Layer
    dbCreateRect(cv list("NP" "drawing") list((0.760:0.760) (w-0.760:2.640)))

    ; Create the Contacts for the NP Ring
    placeContactsNP(w l)

    ; PP Isolation Ring
    ;==================
    ; PP Layer
    dbCreateRect(cv list("PP" "drawing") list((-1.43:-1.43) (w+1.43:-1)))
 
    ; Create the Contacts for the NP Ring
    placeContactsPP(w l)

  ); let
)

;; Create the CDF for the 'l' and 'w' parameters, the width (w)
;; parameter is either hidden or displayed but not editable.
let( (cellId cdfId)
  when(cellId = ddGetObj("testLibDR" "isolationRing")
    ;; if the cell CDF already exists, delete it
    when( cdfId = cdfGetBaseCellCDF(cellId)
      cdfDeleteCDF(cdfId)
    )
    ;; create the base cell CDF
    cdfId = cdfCreateBaseCellCDF(cellId)
    ;; create the parameters
    ;; BM Layer
    cdfCreateParam( cdfId
      ?name     "l"
      ?prompt   "Ring Length"
      ?defValue 10.0
      ?type     "float"
      ?display  "t"
    )
    cdfCreateParam( cdfId
      ?name     "w"
      ?prompt   "Ring Width"
      ?defValue 10.0
      ?type     "float"
      ;; comment out the next line and uncomment the lines below
      ;; it if the parameter is to be visible but not editable
      ?display "t"
;      ?editable        "nil"
    )

    cdfSaveCDF(cdfId)
  ); when
); let for CDF creation

Viewing all 5076 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>