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

Get user input with GUI in the runtime

$
0
0

Hi all.

I'm using Virtuoso IC6.1.8-500.19 and I am writing the SKILL script that needs to take user's input in the runtime.

At first, I implemented it by using gets function and got the input from CIW. It works well.

However, I want to take the input with GUI. 

A trick I can think is that call break to halt the function right after hiDisplayForm, and if the callback is called by clicking "OK", take the value from the form as below.


procedure(test_gui()

    formId = gui_body()

    break()

    want_value = formId-><some_field>->value

);procedure

procedure(gui_body()

prog((formId)

    /* Some field

    ....

    */

    formId = hiCreateLayoutForm(... ?callback "continue()" ...)

    hiDisplayForm(formId)

    return(formId)

);prog

);procedure


But I don't think it is a good way. Is there a way to achieve it?


extract a net from a layout

$
0
0

Hi,

I know there are 3rd party tools that allows user to specify any net(s) on a layout and generate a separate cell that consists of just the specified net(s).  That was many years ago, I wonder if Virtuoso today has such feature?

thanks,

Kevin

Skill code For designing layout for five different metal layers vias arranged in both X and Y axis.

$
0
0

Hello: 

I am new to skill Programming. I want to design a layout using skill in which i want to use five different metals in both direction following a certain distance. I am able to do it with single metal layers but how can i do it with five different metal layers?

how to print the absolute/relative path from file

$
0
0

Hello I have two setting file....setting file 1 which consists of-

source netlist1                                                    (relative path)

top cell  test21

setting file 2 which consists of-

source /xyz/path1/path2/netlist1                       (absolute path)

top cell  test21

procedure(readSetupFile(form)
let((prt split removeQuotes commandArg)
setup_file_path = form->setupFile->value
removeQuotes=pcreCompile("['\"]")
unless(blankstrp(form->setupFile->value)
prt=infile(form->setupFile->value)
when(prt
while(gets(line prt)
split=parseString(line)
when(stringp(cadr(split))
commandArgs=pcreReplace(removeQuotes cadr(split) "" 0)
case(car(split)
(("source")
test = parseString(setup_file_path "/")
test_dir = append1((reverse (cdr (reverse test))) commandArgs)
netpath = buildString(test_dir "/" )
form->netlistPath->value = strcat("/" netpath)
)
("topcell"
form->cell->value=commandArgs
)
)
)
)
close(prt)
)
)
)
)

; dummy form to test
hiCreateLayoutForm(
'forumForm
"Forum example"
hiCreateFormLayout(
'vbox
?items list(
hiCreateStringField(
?name 'setupFile
?prompt "Setup File"
?callback "readSetupFile(hiGetCurrentForm())"
)
hiCreateStringField(
?name 'netlistPath
?prompt "Netlist Path"
)
hiCreateStringField(
?name 'cell
?prompt "Cell"
)
)
)
)

hiDisplayForm(forumForm)

when i give setting file1 path /xyz/abc/cadence/setting1 then output is comign correct as /xyz/abc/cadence/netlist1.

but when am giving setting file 2  path  /xyz/abc/cadence/setting1 then output is comign incorrect as /xyz/abc/cadence//xyz/path1/path2/netlist1 

how to correct so gets the corrrect result.

json to SKILL

$
0
0

Hi All,

I was wondering if there is a simple way to render JSON into a LISP readable format (i.e. with parentheses so I could use lineread)?

I remember a post from Andrew to convert .xml the same way using xsltproc and a custom stylesheet. I am looking for a similar solution

Cheers

Aurélien

SKILL approach to detach labels from pin

$
0
0

I'm looking for a SKILL approach to detach labels from pins.

How to create a GUI with editable table

$
0
0

I'd like to create a GUI with editable table like Virtuoso "Corner setup" form. In the table like form, there are string field, combo field, cyclic field, etc. integrated to the "table". How to create that "table"?

Sort file-data

$
0
0

Hello,

i have a file with the following content:

7.5 (66.3 13.9)
2.2 (69.75 19.75)
36 (65.45 21.25)
3.3 (65.35 19.9)
7.5 (56.15 25.3)

I want to sort the data based on the number in front. The result should be:

2.2 (69.75 19.75)
3.3 (65.35 19.9)
7.5 (66.3 13.9)
7.5 (56.15 25.3)
36 (65.45 21.25)

Can anyone help me with the code? I tried it with "while(gets(...)" and sortcar, but it doesn´t work because i can´t convert the individual lines into lists. 


Is there a way to customize the subckt name from a pcell?

$
0
0

Hi ALL,

I have written a schematic nand2 pcell with w and l can be changed. However, when I instantiate several of them with different sizes in a same schematic, the subckt names for them in the exported CDL are all with _pcell_# suffix (nand2_pcell_0, nand2_pcell_1, ...).

My question is how to change the subckt names from nand2_pcell_# to nand2_#W_#L (eg. W=200n, L=60n, then the derived subckt name is nand2_200n_60n).

 

Thanks.

How to sort rectangles/track (shapes) in a list: left to right and/or top to bottom?

$
0
0

Hi,

I'm working on code for a pcell, in which I generate an array of rectangles in, for instance M1, and M2. The M1 rectangles are multiple rows and wider than tall, the M2 in multiple columns, and taller than wide.

I have a list for the M1 rectangles (containing the database-IDs of the rectangles) and a separate list for the M2 rectangles (also database-ID's).

I want to sort the M1 list in such a way that the first entry of the list is the M1 rectangle at the top ("northern" most) and the lowest ("southern" most) rectangle as last entry. All other neatly sorted in between of course.

I want to sort the M2 list in such a way that the first entry of the list is the M2 rectangle at the left ("western" most) and the the wan furthes to the right ("eastern" most) rectangle as last entry. All other neatly sorted in between of course.

I think I could come up with a very nice, but elaborate/long/complicated/not-understandable/over-complicated/highly-specific/not-efficient, piece of SKILL code to do this. However, I can imagine that there is a very neat/general piece of code/build-in-procedure that I can use to do this. Does anybody know the existence of this, or has done this before and is willing to share this with me? That would be highly appreciated.

Thanks in advance.

With kind regards,

Sjoerd

Timing between deOpen and hiZoomIn

$
0
0

Hi all.

I'm using Virtuoso IC6.1.8-500.19 and I want to open cellview in window, zoom in to the bBox of specific instances, and zoom out by 0.9 scale.

I read the post in the Cadence support site linked below.

SKILL command hiZoomIn fails with the geOpen command and does not zoom into a given instance

And I wrote the skill script to test it as below.

procedure( tmp_zoom()
let((tmp_wid dbId)
tmp_wid = deOpen(list(nil 'libName "my_lib" 'cellName "my_cell" 'viewName "my_view") nil "a" "" nil nil nil)
dbId = car(geGetEditCellView(tmp_wid)->instances)
hiZoomIn(tmp_wid dbId->bBox)
hiZoomWindowAtPoint(tmp_wid 0.9 centerBox(dbId->bBox))
);let
);procedure

However, after it is executed, the location of the instance is off-center.

If I execute it line-by-line, the function works fine that I expected.

According to the post, it seems that the timing issue is resolved when I use deOpen, rather than geOpen, but is there still any timing issue between deOpen and Zoom functions?

Question regarding data read and write in Ocean/Skill

$
0
0

Hello! 

I have a question regarding the data read and write in ocean using skill. Currently I simulate different matrix of pixels and in each simulation I have to read a voltage. When the matrix is 320x240 the data write is slow, the simulation can be 30 mins but the data takes 2 hours into writing. I'll post the code here. My version of cadence is 6.1.8-64b (2018)

File = outfile("File.txt" "w")
for(i 1 76800
sprintf(g "/I%d/Vp" i)
ocnPrint(?output File  value(VT(g) 30m) ?numberNotation 'none)
)

close(File )

Takes way too long when you have bigger matrix, the values reported in the .txt are good and that's why I still use it but for the long run I'd like it to be quicker. What I understand is that ADE writes each value when the loop starts and ends. Is there a way of doing this faster? for example printf doesnt do it quicker. Thanks for the help in advance.

PS: I made a question not long ago (1month~) and still can't figure how to do it in ocean, any help would be appreciated 

community.cadence.com/.../save-data-for-each-iteration-monte-carlo-using-ocean

Inserting a customized toolbar in a layout

$
0
0

Hi,

I am creating a customized toolbar using hiCreateToolbar command and I am using deRegUserTriggers function to insert that toolbar everytime we open a new layout. 
But while doing descend  Shift+X  or/and Shift+B, the user trigger is happening which creates the same toolbar agian as a duplicate in the layout window.

Is there any other proper way to insert a customized toolbar in layout window or how to avoid user trigger while descending or return to top level. 
Let me know if the question is not clear ,I can explain further. 

asiGetPsfDir(asiGetCurrentSession()) do not return ADE assembler simulation path for each sweep values

$
0
0

Hi,

Inside ADE assembler i try to save files for each simulation (sweep), use python to perform some computation (python create a file)

Read back this file  to return waveform inside the outputs 

To write an read the files i use asiGetPsfDir(asiGetCurrentSession()). And everything seem to work except when i try to plot a waveform

When i tried to plot something ADE assembler try to re-compute everything. And this time  

asiGetPsfDir(asiGetCurrentSession()) do not return the same path. The new path do not depends on the number describing the simulation (points)

Interactive.142/1/TEST_1 => after simulation the  Points = 1   and so on

Interactive.142/psf/TEST_1/ => trying to plot

How can i get the correct path ?

Thanks

JL

FL Studio

$
0
0

FL Studio Key has one of the easiest and most flexible interfaces that we have tested for music production programs. To speed up your work and make the resources you use easier to reach. You can detach and resize all of your windows.


Measure the distance between poly

$
0
0

Hello everyone,

I'm trying to measure the distance between resistors, to then check if there is anything strange like a resistor having its fingers space 0.25um  but then the space to a dummy resistor farther than the 0.25.

I found this attached post which create rulers between the layers, the thing is that only works on the current hierarchy, is there any way to do it on all the lvl's?, to kind of flatten everything, create the rulers and then erase everything. 

If anyone could help me to see a better way of doing it or guide me a little bit for doing the flattening stuff would be great. 


create rulers/measurements for width of (and spacing between) shapes in a given area

getVersion()->virtuoso version 6.1.8-64b

getVersion("virtuoso")->sub-version IC6.1.8-64b.500.22

T
hanks in advance

Best regards,
R.Gómez

q_copySkipLibList arguments of ccpCopyDesign

$
0
0

Hi all.

I'm using Virtuoso IC6.1.8-500.19 and I want to copy all "maskLayout" cellviews in hierarchy from cellview A to library of cellview B.

So, I write the SKILL script as below.

src = gdmCreateSpec(A->libName A->cellName A->viewName "" "Library")

dest = gdmCreateSpec(B->libName "" "" "" "Library")

ccpCopyDesign(src dest nil 'CCP_NO_EXPAND nil list("maskLayout"))

However, it returns error with the message,

*Error* ccpCopyDesign: argument #5 should be a gdm spec list (type template = "GGgsqllttsqggg") - nil

Could you tell me how can I fix it?

How to convert a floating point number into a string with unit prefix?

$
0
0

Dear all,

VerilogA knows a string format specifier %r to convert a floating point number into a string with suitable unit prefix (..., a, p, n, u, m, k, M, G, T...), such that something like

printf("Number = %r", 0.00375)

prints

"3.75m"

Is there anything alike in SKILL?

I find %g, %f and the lot, but nothing that can convert a floating point number like 0.00347 into a string with unit prefix like "3.47m".

However, this is everyday work for all the Cadence Tools, so I guess there must be at least a function that can accomplish this.

Thank you very much!

epxt() calculates wrong results - same with pow(), same with ** operator

$
0
0

I ran a test script using the expt() function, and it gave odd results.

So I typed it directly into CIW command line:

expt(10 12)

=> -727379968

I would expect the answer to be 1000000000000.

It works for a power of 9, though:

expt(10 9)

=> 1000000000

Same happens with other exponents:

for(i -24 24 printf("%g\n" 1.0*expt(10 i)) )

=>

1e-24
1e-23
1e-22
1e-21
1e-20
1e-19
1e-18
1e-17
1e-16
1e-15
1e-14
1e-13
1e-12
1e-11
1e-10
1e-09
1e-08
1e-07
1e-06
1e-05
0.0001
0.001
0.01
0.1
1
10
100
1000
10000
100000
1e+06
1e+07
1e+08
1e+09
1.41007e+09
1.21575e+09
-7.2738e+08
1.31613e+09
2.76447e+08
-1.53049e+09
1.87492e+09
1.56933e+09
-1.48662e+09
-1.98128e+09
1.66199e+09
-5.5994e+08
-1.30443e+09
-1.59384e+08
-1.59384e+09

By the way: 10**12 is also -727379968 accoring to CIW...

Is there a bug?

Replace list elements based on input criteria

$
0
0

Example input to the function is a string  "0.0 0.12u -0.12u 0.18u".

What I need is something that will replace any value below 0 with 0 and replace any value above a given maximum to the maximum. For example, if the given maximum in 0.16u then the above example input should return "0.0 0.12u 0.0 0.16u".

I made it work with the following but I'm wondering if there is a better way.

input = "0.0 0.12u -0.12u 0.18u"

threshold = "0.16u"

listInput = parseString(input)

newList = list()

foreach(element listInput
  if(evalstring(element) > evalstring(threshold) element = threshold)
  if(evalstring(element) < 0 element = "0.0")
  newList = append1(newList element)
)

Viewing all 5098 articles
Browse latest View live


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