dump all the layer from Palette Assistant window in case of no LSW layer definitions in the specified technology database
SKILL descend into a component sub-circuit schematic
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
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()
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.
lxCheck but with useful return?
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.
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
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?
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
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?
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
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()
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
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
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
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
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
Skill Code Need to Toggle Path or Path Segment Width
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
SKILL pCell STREAM OUT failure
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