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

Instantiating instance from command line: no properties stored.

$
0
0

Hello,

It is possible to instantiate an instance with (CDF) properties/parameters in a cell in two ways: manually through the graphical layout editor or by using SKILL code from the command line in the CIW. The same can be said about instantiating instances in a cell in schematic.

This is what we see when we do it manually:

  1. Create a new cell - view (i.e. cell name = testManual, view name = layout)
  2. Instantiate an instance with properties (i.e. a transistor) with all default values, so do not change any of the properties
  3. After the instance has been instantiated, select it and then perform the following two commands in the CIW:
    1. object=car(geGetSelSet())
    2. length(object~>prop)
  4. The output of 3.b is a numerical value telling you how many properties are stored for that instance. This number should be equal to the number of properties that can be found in the CDF Editor for that particular instance (at least the same as the number of properties with the storeDefault flag set to TRUE)

This is what we see when we do it using commands in the CIW:

  1. Create a new cell - view (i.e. cell name = testSkill, view name = layout)
  2. Perform the following commands in the CIW to instantiate an instance in a cell, use values for libName, cellName, viewName that are valid in your environment:
    1. cv = geGetWindowCellView()   ;;; To get the dbId of the cell view we're editing
    2. newInstId = dbOpenCellViewByType( libName cellName viewName )   ;;; To get the dbId of the instance we're going to instantiate
    3. inst = dbCreateParamInst(cv newInstId "inst_0" 0:0 "R0" 1)
  3. At this point, you should have an instance in the cell - view testSkill - layout
  4. Select this instance in the layout editor and perform steps 3.a and 3.b of the manual instantiation

And this is where we see the difference: when performing the manual instantiation the length is correct, when doing it through SKILL commands the length is 0 (no properties stored). This puzzles us: what is the difference between manual instatiation and code instantiation? We expected this to have the same output.

In some code we're developing we're relying on the availability of all properties when instantiating an instance. When we encountered this, we thought we had the solution by invoking CCSinvokeInstCdfCallbacks(inst ?useInstCDF t ) (this is code we got for a different problem, but it seemed to work in this case). But this did not solve all the problems. Not all properties will be stored after invoking this command. If the list of properties has for instance 35 entries, after CSSinvoke... we only see approximately 27 entries (just to give an idea). The entries that are missing apear to be randomly chosen: we're missing strings, cyclics, booleans and integers/floats. But they all tent to be towards the bottom of the list of properties.

We have tried many other commands to instantiate an instance but all had the same outcome: none of the properties are stored, or not all after CSSinvoke....

What we would like to know:

  • Is this expected behavior, and if so, why?
  • What must I do to ensure that when I instantiate an instance all properties are stored?

A little information:

The PDK is developed by ourselves, so if something needs to be done there, that is possible. All CDF properties have the saveDefaults flag set to TRUE, so all strings, booleans, cylics and integers/floats. All properties are needed since a colleague is developing a validation toolkit to validate the PDK we're developing, to ensure nothing breaks when releasing a new version. This validation toolbox automatically instantiates hundreds of instances in many cells to do various checks (check-and-save, simulation, drc, lvs, etcetera) and is fully automated.

Any help here is highly appreciated.

With kind regards,

Sjoerd

 


Modify cdf param value based on its current value using SKILL

$
0
0

Hi ,


I am trying to alter some cdf parameter value using SKILL 

For example , I want to increase width by 100 (for example 100n or 100u)

if current value of w is

w = " 200n "

then I want to set it to " 300n"

if w is " 500u" then I want to set it to "600u" and so forth.

While looking for function in document I found following function which might be useful in this process,

cdfFormatFloatString("123.4"  "m") => "123400.0m"

cdfParseFloatString("1.0u") => 1e-06

 I am trying to manipulate cdf parameter value based on its current value. 

Please help.

Thanks

san

Regular Expression: detecting 2 or more consecutive spaces oddity

$
0
0

Hi,

For a particular script I have to check whether or not a string has two or more consecutive spaces between lower-case characters. Zero and one space are allowed, two or more not. I am using rexMatchp() to check. Please have a look at the following code+output:

rexMatchp("[a-z][ ]{2,}[a-z]" "test test")

nil

rexMatchp("[a-z][ ]{2,}[a-z]" "test  test")

nil

rexMatchp("[a-z][ ]{2,}[a-z]" "test   test")

nil

rexMatchp("[a-z][ ][ ]+[a-z]" "test test")

nil

rexMatchp("[a-z][ ][ ]+[a-z]" "test  test")

t

rexMatchp("[a-z][ ][ ]+[a-z]" "test   test")

t

The three last commands do exactly what I want. However, the first three do not work, although this is perfectly legal syntax for a regular expression. I found in the Virtuoso documentation that using {} to specify the number of occurrences is supported, but it clearly doesn't work in my example.

Am I doing something wrong?

With kind regards,

Sjoerd

how to return from the long run time jobs

$
0
0

Hello ,

I am trying to write some skill code to run "oaScan -lib -cell -view" for the cell hierachically.

For example, there is a chip A which includes Block B1 and B2.Block B1 includes Cell C11,C12; Block B2 includes Cell C21,C22.

cellList=list(C11,C12,C21,C22).

foreach(cellName cellList

csh(strcat("oaScan -lib testlib -cell " cellName " -veiw layout" " >> " rstFile)

But i found the "oaScan -lib -cell -view" runs a long time for some cells without outputting anything.For example, it runs a long time for C11.

My issue is how i could tell the foreach to jump out for C11 and printf("the c11 couldn't be run) after a long time running (eg. 10 minutes).And begin to run for C12,C21,C22.

Ignore property for schematics ( LX binding )

$
0
0

lxSelectedUpdateIgnore works on layout instances.

There does not seem to be an equivalent "ignore" function for schematic instances...

Here is the scenario:

Typically in layout there are elements which are artifacts of the layout, i.e. they may be dummy transistor cells which are required by the technology.

In many of these instances, when I insert such layout instances I break VLX correspondence, and have to set the ignore property on these "dummy" cells.

Eventually I have to add them into the schematic to pass LVS, but in doing so, again I break VLX correspondence (this time from the schematic side).

After adding these "dummy" transistors in schematics (and breaking the correspondence), if I were to Update from source, the dummy transistors

will be instantiated in the layout, and setting the binding between the "dummy" layout instances and the corresponding schematic instances is normally

not feasible (it is possible, but in general dummy cells from a given library typically don't contain any connectivity information, i.e. net/terminal/pins).

Hope this makes sense, in general it seems it would be useful to have the ignore property on the source side as well.  But perhaps there are other 

approaches that circumvent these issues.  I know it is also possible to have two different schematic views associated with one layout, but having two

views adds more complexity and becomes more error prone, I rather just have one schematic and one corresponding layout view.  If you have other

suggestions please let me know.

Thanks in advance,

-f

Open "Choosing Analyses form" for specific analysis with skill

$
0
0

Hi All

I am tring to open "Choosing Analyses form" for specific analysis with skill.

What I found is "sevEditSelectedAnas(session)", it can open the "Choosing Analyses Form"

but it requires to select the analyses first, and I cannot find an API to select the analysis.

What I need is something similar as "sevEditSelectedAnas(session)"

instead of having one argument, it can receive the second argument as "analysis name".

Thus some functions like "xxxSevEditAnas(session anaName)"

Then I can open "Choosing Analyses form" for specific analysis defined by the second argument.

 

Best Regards


Yi

svn/git integration, question about libgdm*_sh.so file.

$
0
0

Hi all!


I think, that a lot of people made integration svn ot git. Could you pls. tell me where can I find the  libgdm*_sh.so file? Or what skill hook need to use?

How to let the script continue after a form has been opened by "sevEdit..." or "sevChoose..." API

$
0
0

Hi All

In my previous post, I mention the method to open the "Edit Choosing Analyses" form, with "sevEditSelectedAnas(session) "

after some further testing, I realize one issue with my method.

When the form has been brought by "sevEditSelectedAnas(session) ", the script has been stop for executing temporarily until the form has been closed.

Does anyone know how to let the script continue after invoking a form opened by "sevEdit..." or "sevChoose..." API

Best Regards

Yi


Timeout a procedure within SKILL

$
0
0

Hi,

Within a SKILL procedureA, I am calling another SKILL procedureB.  In a normal scenario, procedureB should finish within 20-30 seconds.  If I want to terminate the procedure execution after X minutes, how would I do that?  IpcBeginProcess starts a new process and I don't want that.  Is there a timeout type feature for a skill procedure call?  Thank you.

procedure( myProcedureA()

   myProcedureB() ; <<<< want to terminate the procedure if not done within some time limit.

) ; end myProcedureA

procedure( myProcedureB()

   ;; do bunch of stuff

   ;; stuff should be done within 20-30 seconds

   ;; Terminate the procedure if not done within some time limit.

) ; end myProcedureB

ENVIRONMENT VARIABLES

$
0
0

Hello,

Currently I meet a problem with my environnement variable (from unix) and cadence virtuoso.

Sometimes I have to change an environment variable to work in dev mode ( It's an environment variable who I have created). But If my cadence virtuoso is already open it doesn't get the new value of my environment variable.

Description:

I work with cadence virtuoso to make some layout, i need to change of mode to load any skill procedure.

I go in my script, I change my environment variable "TOTO" in 1 then I source my script .mycsh.

In unix my environment variable is modified  now "TOTO" value is 1 whereas before it value was 0

I check in CIW ==> getShellEnvVar( "TOTO")  return of the function is not update the value is always 0

Therefore I stay in prod mode and I can't get the right path to load my skill procedure.

 

Please, could you tell me if there is an way to resolve my problem, thanks lot !

The code to add elements to open form in SKILL

$
0
0

Hi Andrew,

I found " Adding elements to open form in SKILL" questionwhich was answered by you in this blog. However,  I cannot cut and paste your code to  "vi" session because there are some garbage characters and all carriage returns are missed. How do I find your code as attachment in cadence.com ?

Thanks,

ManChak

Reading simulation results using Skill

$
0
0

Hi,

I am looking for a Skill way of reading the signal names that have been saved during an ADE-XL simulation. I am aware of the outputs() function. However, in my case this function exits with a regEx error message - I guess due to some slightly unconventional naming of my lib and cells. However, I don't want to rename my design. Therefore I am looking for an alternative to the outputs() function. Using the Results Browser, I am able to see all my signals. Can I do this with Skill too, without using the outputs() function?

Thanks

Chris

Creating rectangles with rounded corners in Layout using SKILL (PCell)

$
0
0

HI,

I have written some code to generate the layout of a p-cell high-voltage transistor. All shapes created are rectangles (like the active, contact, metal layers).

While measuring the devices it was found that the break-down voltage was really low, much lower than anticipated. One of the solutions that has already been tested, and has been proven to be very effective, is to create rounded corners for some of the layers involved. The layouts to test this were all generated manually. No it is my task to put that (rounding the corners) in the p-cell.

Is there an easy solution to convert a rectangle in a rounded-corner rectangle? Something like this already exists in Cadence as a SKILL procedure? If not I just have to come-up with something clever myself...

With kind regards,

Sjoerd

How to disable the default double click callback in a tree table

$
0
0

Hi all

In a tree table in a form.

There is a kind of default callback for double click on a tree item.

It will expand/collapse such tree item.

I'd like to know how to disable it.

As I assigne an other self defined callback function. And I don't want such tree item to be expanded or  collapsed.

Best Regards

Yi

Write to the ADE L output window

$
0
0

Hi there,

I'm moderately new to the SKILL API, but I didn't see anything immediately that allows writing to the ADE L outputs window, the area to the bottom right of the Design Variables and Analyses. I think I saw a related function to ADE XL (axlAddOutputs, may not be the right one though), but couldn't find one related to ADE L.

Thanks,

Ryan


NLP expression

$
0
0

Looking for a way to convert NLP expression into pPar statements

Which command(s) should be used to change

[@L:%]*[@R:(%/3)]

to

pPar("L")*(pPar("R")/3)

Thanks



Getting report() into a list

$
0
0

I want to get the operating point of a device into a list so I can fiddle about with it....but report() just writes to terminal....how do I get it into a list ?

I do not want to write it to a file.

For example

ocean> report(?param '("vds" "vgs"))


/MN2           
         vds    = 636.4m                   vgs    = 636.4m         
/MNbias        
         vds    = 636.4m                   vgs    = 636.4m  

But I want to put each device into a list with the vds, vgs etc

Thanks

How to determine the direction of a wire out of a symbol pin in schematic

$
0
0

Hi,

I would like to write some SKILL to add wire stubs and labels to a certain symbol instantiated and selected in a schematic cellView.

I think I have the basics in place, i.e. reference to a selected cellView with geGetSelectedSet() and then dig into its instTerms and

from there to each instTerm~>term~>pins~>fig~>bBox, then transform it to the bBox relative to the cellview with dbTransformBBox()

basically:

cv = geGetSelSet()

foreach(instTerm cv~>instTerms

instTermBbox=car(instTerm~>term~>pins~>fig~>bBox)
instTermBboxInCv=dbTransformBBox(instTermBbox
                           car(inst~>transform))

)

code might need some polishing, especially when extracting the right item from the list returned by - for  instance - inst~>transform or ...~>bBox.

So from here, I can use schCreateWire() and schCreateLabel() to add a wire and label.

The point where I'm puzzled is: how to determine the direction of the wire? How do I determine the position of the pin within the shape?
I am thinking of using the symbol's bBox to infer whether the pin is on its top, bottom, left or right side, however when I query the bBox of the selected shape, I get something weird.

I have placed a single vcvs on an otherwise empty schematic. I select it in the window, and then call cv = geGetSelSet().

cv~>bBox returns the following:

(((-0.48125 -0.2125)
(0.91875 0.26875)
)

The strange thing about this bBox is that the y coords (I'm assuming they are the second elements in each tuple) are more or less correct, i.e. they correspond roughly to the bottom and top pin extremes, whereas the the x coords are further away from the boundaries of the symbol.

So I'm wondering what this means and how to interpret it.

Thanks for any help,

Michele

sevEvaluateAndPlotExpressions

$
0
0

I added an expression using sevAddExpression, which adds an expression and it is displayed in the ADE L output pane (plot toggle not checked).

I try to plot the expression using sevEvaluateAndPlotExpressions with the same session, I've tried sevPlotAllOutputs and sevOpenPlotWindow. sevGetSession returns nill, which I assume is the root of the problem.

I can only get the expression to plot if I manually select "plot" toggle from the ADEL output pane. The only way it seems to plot in skill is if I plot using plot(waveform) rather than plotting expressions that are added to the session. Is it possible to plot via the sevEvaluateAndPlotExpressions?

Create guarding pcell

$
0
0

I would like to create guarding pcell. What is the correct way to implement it ? 

 Should I implement guard ring using rod command ?  Someone mentions fluid guard ring (FSR).  I am new to FSR. Could you point me to the document (App Note) about guard ring implementation using FSR ?

Thanks,

ManChak

 

Viewing all 5074 articles
Browse latest View live


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