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

skill code equiv of ADE-XL Create/Spec Summary and Plot all waveforms?

$
0
0

I have a family of IP (amplifiers for the sake of discussion) and I'm moving away from ADE-XL to Ocean-XL for simulation.  Why?  Because I have a variety of different designs which are pin compatible but have varying power consumption, bandwidth, etc.  I want to have basically the exact same set of scripts and just load a config file that specifies my design and a few of the numbers (target power, target bandwidth, etc).  Then I can share all of that code across a bunch of designs and when layouts are complete I can use the exact same code for extracted views.

The problem I'm running into is I can't seem to figure out a skill code equivalent of the ADE-XL  Create->Spec Summary followed by saving to CSV.  ocnxlOutputSummary() is sort of similar but gives a drastically different output format and I already have tools which can read the ADE-XL spec summary CSV file and format into the document format I require.

Similarly, I don't see a skill equivalent of the Results tab, Plot all Waveforms button in ADE-XL.  What I've been doing is clicking that button and then I have skill code which creates EPS files for each of my subwindows that result.

In the past, I've used ocean (not ocean-xl) with quite a bit of success for things like this but wanted to take advantage of the job distribution, specifications, etc. that ADE-XL (and hence ocean-xl) offer.  Also soon I will have no choice for Monte-Carlo.

Any suggestions?

Thanks

-Dan


Customising Forms

$
0
0

Dear all,

I would like to know if, on a form, it is possible to verify the information entered in a text box as the user is writing ?

Eg.

I have a text box (I am sorry if this is not the name in SKILL) that asks the user to enter the directory where he wants to save the files. I would like to check that the directory is valid without waiting for the user to press the "OK" button.

I would like as well to know, if it is possible to customise the buttons on a form and force the buttons to use my own functions?

Thanks in advance,

José

Open and close ViVA sessions

$
0
0

Hello!

I am trying to open multiple Viva sessions and am using the skill command awvCreatePlotWindow()

However, when I run this a second time it only opens a new tab inside the first main window not a separate Viva window

1) How do I create a separate Viva session instead of a second tab inside the previous session?

 

Also the return window Id is the window Id of the Tab not the main window of the Viva Session.

I can close the tab with this window Id, but not the main Viva session.  

2) How do you close the Viva Session instead of the Tab?

Thanks in advance!

- Chandra.

How to use ?modifyCallback on hiCreateStringField() properly?

$
0
0

Hello,

For a string field of a form, I want to specify a callback function which gets triggered after each keystroke. I use the function hiCreateStringField() and I specify the ?modifyCallback to trigger the function I want (it performs a rexMatchp() on a list that has all cells in a given library and puts this list as the ?choices list in an other (cyclic) form field, thus the list gets updated dynamically, making it easier to locate a cell in a library).

Somehow it doesn't work properly since I get errors.

To start, this is working fine, and the callback function works properly (just to make clear that there is no error in the code of the callback function):

hiCreateStringField(
  ?name       'BcipFindCellsToBrowse
  ?prompt     "Cells to browse:"
  ?value      ""
  ?defValue   ""
  ?callback   "tempProc()"
  ?editable   t
  ?enabled    t
)

This is the tempProc():

procedure( tempProc()
  let( ( ( temp nil ) )
    BcipGuiForm~>BcipCellsToBrowse~>value = nil
    if( equal( BcipGuiForm~>BcipFindCellsToBrowse~>value "" )
    then
      BcipGuiForm~>BcipCellsToBrowse~>choices = BcipDefineCellnameList( BcipGuiForm~>BcipLibrariesToBrowse~>value )
    else
      foreach( item BcipDefineCellnameList( BcipGuiForm~>BcipLibrariesToBrowse~>value )
        when( rexMatchp( BcipGuiForm~>BcipFindCellsToBrowse~>value item )
          temp = cons( item temp )
        ) ;;; end of when
      ) ;;; end of foreach item
      BcipGuiForm~>BcipCellsToBrowse~>choices = reverse( temp )
    ) ;;; end of if
  ) ;;; end of let
) ;;; end of procedure tempProc

So, when typing in the springfield, after it loses focus it performs tempProc() and the ?choices list of BcipCellsToBrowse gets updated accordingly.

When I do the following:

hiCreateStringField(
  ?name             'BcipFindCellsToBrowse 
  ?prompt           "Cells to browse:"
  ?value            ""
  ?defValue         ""
  ?modifyCallback   "tempProc()"
  ?editable         t
  ?enabled          t
)

It generates errors.

After each keystroke, the procedure tempProc() gets executed (I know that since the ?choices list gets updated correctly) but the following error is reported in the CIW:

*Error* eval: not a function - 'BcipFindCellsToBrowse
*Error* car: Can't take car of atom - ERROR

I get the same error if I replace "tempProc()" with "printf(\"Help\")".

When I look at the documentation, the explanation for ?callback differs significantly from the ?modifyCallback explanation.

The ?modifyCallback passes three values to the callback function (s_filename, t_lastTextValue and g_sourceOfChange) and it expects to get back either t, nil or a value. This is where it is breaking in my code, I suppose. I have tried several things (like returning a "t" at the end of tempProc()) but none of them worked.

So I would like to know:

  • the ?modifyCallback passes three values, how do I access them (for an other form I really want to know what the g_sourceOfChange is)
  • How do I return something to satisfy the ?modifyCallback of the field?
  • And what should I return (simply "t")?
  • Is there a smarter method for what I want (something already build into Cadence/SKILL)?

Any help is highly appreciated since I hate to distribute code that works but generates errors.

With kind regards,

Sjoerd

ps:

This is what BcipDefineCellnameList() does:

procedure( BcipDefineCellnameList( refLib "l" )
  let( ( ( lib nil )
    ( libDbId nil )
    ( cell nil )
    ( cellNameList nil ) )

    foreach( lib refLib
      libDbId = ddGetObj( lib )
      foreach( cell libDbId~>cells
        if( member( cell~>name cellNameList )
        then
          cellNameList = cellNameList
        else
          cellNameList = append( cellNameList list( cell~>name ) )
        ) ;;; end if
      ) ;;; end foreach cell
    ) ;;; end foreach lib

    cellNameList = ( sort cellNameList nil )

  ) ;;; end let
) ;;; end procedure BcipDefineCellnameList

refLib is a list of strings, each string is the name of a library.

Reformatting of a list

$
0
0

Hi everybody,

I have a list that look something like that:

list1 = list(list("a" "1" "1") list("a" "1" "2") list("a" "2" "3") list("b" "5" "5") list("b" "5" "6") list("b" "7" "8"))

and I want this list to be reformatted to look like that:

list2 = list(list("a" list("1,1" "1,2" "2,3")) list("b" list("5,5" "5,6" "7,8")))


Anybody have an elegant way of doing that???

Thanks

Fred

Call a function after the user has selected something in the schematic editor

$
0
0

Hello,

I have a simple matter to solve. I would like to have a function called when the user selects something in the schematic editor.
In particular, whenever the user click on a wire, I'd like to call a function f(wire) that does something with the wire label.

How can I do this? I didn't find anything suitable in the function trigger names table.

BTW, is it possible to have a function called when the user closes a tab or clicks on edit->hierarchy->return menu item?

Thank you.

geAddNetProbe to current Window

$
0
0

I am trying to add a probe to a specific net within a schematic window. What I'm finding is I get an error message that the net specified doesn't exists at the upper level schematic (I've descended into the hierarchy). I verified the hiGetCurrentWindow is returning the correct window. Is this the correct behavior of this function to only probe nets that exist all the way through the hierarchy?

geAddNetProbe(hiGetCurrentWindow() list("y1" "drawing") net)

Add a button into transCdlOutForm

$
0
0

Hi everyone,

I just try to add a file browse button for cdlOIncFile ("include file") in transCdlOutForm when i ues it, the code as follow:

cxtPath=prependInstallPath("/etc/context/transUI.cxt")

unless(boundp('transCdlOutForm) loadContext(cxtPath)

testCdlIncFileBrowse=hiCreateFormButton(

                                                         ?name 'testCdlIncFileBrowse

                                                         ?buttonText "...."

                                                         ?callback "ddsFileBrowseCB(transCdlOutForm 'cdlOIncFile)" )

hiAddField(transCdlOutForm list(testCdlIncFileBrowse 630:459 35:35) )

When i load it,  the CIW shows the warning: hiAddField: invalid filed description

But i try to add this button into a form which i created, it's no problem.

So i don't know where the issue is~~~~

Please help me , thank you very much!


Descending into a group from figure coordinates in layout

$
0
0

I have groups (figure groups) within groups ..., i.e. nested groups.

From the toplevel of the hierarchy, I would like to descend to the geometry under point.

Given that I cannot select the geometry at toplevel because it is deeply nested in other groups, what is a good way of getting to it.

Yes, it is possible that the geometry at point may be overlapping other geometry in the same layer, in which case I would like to have all the possible choices under point.

Thanks in advance.

Understanding list returned by geGetHierMemInst

$
0
0

Hello,

I am working on a task which involves keeping track of the history of descents into a hierarchy, but now I am a bit puzzled by the behaviour of geGetHierMemInst.

As an example, let's begin at the top cell. As expected, if I call geGetHierMemInst((getCurrentWindow)) I get nil.

The top cell has an instance named "A". If I descend into it and call (getCurrentWindow)~>cellView~>instances~>name I get all the names of instances contained in the cellView of instance "A", which is what I expect. Also, (caar geGetHierMemInst((getCurrentWindow)))~>name returns "A", as expected.

Now, what I find odd is that, if I call (caar geGetHierMemInst((getCurrentWindow)))~>cellView~>instances~>name I get a result that, not only is different from what (getCurrentWindow)~>cellView~>instances~>name returns, but it is equal to the names of all instances contained in the top cell.

What am I missing?

To be more clear about what I need to do, let's assume that I am at level 3 of this hierarchy A->"B"->"C" (A is a top cell and "B" and "C" are instance names down the hierarchy). If I select a wire in instance "C" that is connected to a pin, I want to know how this pin is connected at the level of instance "B". To do this at level "C", I use geGetHierMemInst to get to "B" and I look at all instances contained in "B" until I find an instance named "C". The I explore how wires are connected to the symbol of "C" contained in the cell view of instance "B"

Thank you.

Patrik

How to start these jobs one after another

$
0
0

Hello , 

I have 2 jobs which are needed to be run one after another automatically.But i didn't know how to tell skill that  job1 has been finished and you could  begin job2.

The only signal is that when job1 is done, there is a job1ResultFile which contains words "job1 run successfully." Is it possible to let job2 to recieve the signal as the start signal? It is a little hard to use ipcSleep.Because the running time of job1 varies from cell level to chip level for us.And it seems like that job1 cann't be used as the childprocess of ipcBeginProcess either.

I have given some tries like below:

job1~>job2

I check the running status of job1 manually to make sure it ends.  Then input the below command, Job2 begins successfully.

ipcBeginProcess("grep 'job1 run successfully' job1ResultFile"" 'LAYdatahandle nil 'Job2 "")

But it fails, when i submit job1 and the sentence together.it seems like that at the moment i submit job1, the job1ResultFile has not been gotten compelely.

Accessing dynamic form fields

$
0
0

Hello everyone,

I'm building a form, that is supposed to read something and then depending on that number, it outputs a form with fields with the same number. For example:

for(i 0 length(namesList)-1
namesHandle=hiCreateCyclicField(
?name makeSymbol(strcat("sym" sprintf(nil "%L" i)))
?choices '("" "a" "b")
?prompt " "
?value ""
);hiCreateCyclicField
);for

The code, afterwards, goes on with the same manner to create a 2D form with number of fields.

The form is beautiful and everything is perfect, except for one thing. I want at the end to let the user enter his data and then save his inputs into a file.

I can create the file and save whatever I want to it but for some reason I can not access the values of the form fields.

If I write in CIW this command: myform->sym2->value I get the current value of that field with no problem. But since I don't know the number that is attached to sym because this number is totally generic, it always brings back nil if I replace sym2 with something else like makeSymbol() or concat("sym" i) where i is a for loop counter

foreach(name namesList

fprintf(filePort "%s" name)

fprintf(filePort "%s\n" myform->sym0->value)

)

What I need, at the end, is to be able to loop through this field's names to retrieve every value attached to it.

Any help is appreciated, thanks

Sherif

Skill code to add the option in toolbar to show layer properties

$
0
0

Hi,

I do have the following skill code to display the selected layer property in the toolbar. Right now it just shows the selected layer and the purpose, but how can i add a third field to it to show the width of the same layer?

procedure(dynamicMetUpdate()

let((win choice layer purpose barId)

mouseSingleSelectPt()

if( car(geGetSelectedSet())~>lpp then

choice=car(geGetSelectedSet())~>lpp

pathWidth=car(geGetSelectedSet())~>width

else 

choice=list("" "")

)

layer=car(choice)

purpose=cadr(choice)

win=hiGetCurrentWindow()

barId=car(setof(menu hiGetWindowToolbars( hiGetSessionWindow(win) )

            rexMatchp("^myToolBar" symbolToString(menu~>hiToolBarSym))))

if(barId then

hiDeleteToolbarItems(barId list('C_GROUP1 'C_GROUP2))

C_GROUP1=hiCreateToolbarComboBox(

                ?name 'C_GROUP1

                ?prompt "Selected Layer "

                ?value  layer

                ?editable nil

?enabled nil)

C_GROUP2=hiCreateToolbarComboBox(

                ?name 'C_GROUP2

                ?prompt "Selected Purpose "

                ?value  purpose

                ?editable nil

?enabled nil)

               ;items

 hiAddToolbarItems(barId list(C_GROUP1 C_GROUP2))

)

if(!boundp('myToolbar) then

myToolbar = hiCreateToolbar(

   ?name 'myToolBar

   ?title "My Toolbar For Fixed Menu"

   ?toolButtonStyle 'textBesideIcon

   ?toolTip "My Fixed Menu Toolbar"

   ?invisible t

   ?items list(

            hiCreateToolbarComboBox(

                ?name 'C_GROUP1

                ?prompt "Selected Layer "

                ?value  layer

                ?editable nil

?enabled nil)

               

        

hiCreateToolbarComboBox(

                ?name 'C_GROUP2

                ?prompt "Selected Purpose "

                ?value  purpose

                ?editable nil

?enabled nil)

              ) ;items

        ) ;hiCreateToolbar

    );unless

unless(win~>cellView win=cadr(reverse(hiGetWindowList())))

 

hiPlaceToolbar(hiGetSessionWindow(win) myToolbar 'top)

  hiShowToolbar(myToolbar)

   )

)

hiSetBindKey("Layout" "None<Btn1Down>" "dynamicMetUpdate()")

procedure(dynamicMetUpdate()let((win choice layer purpose barId)mouseSingleSelectPt()if( car(geGetSelectedSet())~>lpp thenchoice=car(geGetSelectedSet())~>lpppathWidth=car(geGetSelectedSet())~>width
else choice=list("" ""))layer=car(choice)purpose=cadr(choice)win=hiGetCurrentWindow()barId=car(setof(menu hiGetWindowToolbars( hiGetSessionWindow(win) )            rexMatchp("^myToolBar" symbolToString(menu~>hiToolBarSym))))if(barId thenhiDeleteToolbarItems(barId list('C_GROUP1 'C_GROUP2))
C_GROUP1=hiCreateToolbarComboBox(                ?name 'C_GROUP1                ?prompt "Selected Layer "                ?value  layer                ?editable nil?enabled nil)C_GROUP2=hiCreateToolbarComboBox(                ?name 'C_GROUP2                ?prompt "Selected Purpose "                ?value  purpose                ?editable nil?enabled nil)               ;items hiAddToolbarItems(barId list(C_GROUP1 C_GROUP2))
)if(!boundp('myToolbar) thenmyToolbar = hiCreateToolbar(   ?name 'myToolBar   ?title "My Toolbar For Fixed Menu"   ?toolButtonStyle 'textBesideIcon   ?toolTip "My Fixed Menu Toolbar"   ?invisible t   ?items list(            hiCreateToolbarComboBox(                ?name 'C_GROUP1                ?prompt "Selected Layer "                ?value  layer                ?editable nil?enabled nil)                       hiCreateToolbarComboBox(                ?name 'C_GROUP2                ?prompt "Selected Purpose "                ?value  purpose                ?editable nil?enabled nil)              ) ;items        ) ;hiCreateToolbar    );unlessunless(win~>cellView win=cadr(reverse(hiGetWindowList()))) hiPlaceToolbar(hiGetSessionWindow(win) myToolbar 'top)  hiShowToolbar(myToolbar)   ))
hiSetBindKey("Layout" "None<Btn1Down>" "dynamicMetUpdate()")

How can drop an auto via?

$
0
0

There is an existing option in layout to drop automatic via, but this isnt completely automatic, i need to access it through the Creat Via form like "Create->Via->Auto->Hide". But how can i avoid accessing this form itself? I just want to press a key that calls the function to create the auto via and then just by clicking on the metals in layout, it should just drop the via.

How to sort pins/labels in VLS?

$
0
0

Hi,

I use VXL to generate the devices and pins. The pins usually come with labels on it, but the VXL sometimes place the pins randomly even if they are a bus. For example, if i've a pin Ctrl<30:0>, its pretty difficult to sort them out if they are randomly placed. Is there a skill i can use to sort the pins out along with their corresponding pinLabels?


How to add a wire and a label to the power and ground pin in schematic

$
0
0

Hello, everyone,

The standard cells provide by foundry PDK have four power pins, VDD, VBP, VSS ,VBN. In layout, I connected the VDD and VBP together to VDD, VSS and VBN together to VSS. The schematic generated by importing the structured verilog file don't have wires to connect VDD and VBP, VSS and VBN. Just like the figure below,

I want to add a wire to connect VDD and VBP , VSS and VBN together for each cell, and add a label VDD, VSS respectively.

like below (I add the wire and label manually)

How to use SKILL script to achieve this effect in Virtuoso Schematic ?  Thank you very much. I will appreciate your help.

Best Wishes to everyone,

Jesse

Use mouse to select an instance during a procedure

$
0
0

In the middle of a procedure I want to select an object in the layout, hit enter, and continue with the procedure. I want to do a geGetSelSet() on the selected items.

Is there a procedure to do this kind of action?

Problems creating sub category using SKILL

$
0
0

Hi All,

I am trying to create a sub category and copy over some cells from main category to sub category and rename it

I am following steps as below:

libName= "myLib"

ddId= ddGetObj(libName)

topCatId=ddCatOpen( ddId  "mosfet"   "a" )

subCatname="mosfet_nondefault"

subCatId=ddCatOpen( topCatId  subCatname   "a" )

Then I am getting list of cells I need to add to this new category. Those cells already exist in "mosfet" category. 

finalCellList=list("nch"  "pch"  "nch_dnw") 

 

After getting the cell names I copy schematic and symbol views of that cell in a new cell named <cellName>_nondefault.

foreach(cell finalCellList
   originalSchId=dbOpenCellViewByType(libName cell "schematic"  ""   "a")
   originalSymId=dbOpenCellViewByType(libName cell "symbol"   ""   "a")
   cell=strcat(cell "_nondefault")    
   duplicateSchId=dbCopyCellView(originalSchId libName cell "schematic" nil nil t)
   duplicateSymId=dbCopyCellView(originalSymId libName cell "symbol" nil nil t)      
   dbClose(originalSchId)
   dbClose(originalSymId)   
   cellList=append1(cellList cell)
)    

I get the list of new cells and then try to add them to new category.

foreach(cell cellList
  itemId=ddCatAddItem(subCatId cell "cell")
  unless(itemId
     error("failed to add cell\n"))
)
    
ddCatSave(subCatId)
ddCatSave(topCatId)

ddCatClose(subCatId)
ddCatClose(topCatId)
ddUpdateLibList()

After following all these steps when I look at the category list in library manager , I do not see the sub category. So basically category is not created ? or it's just its not visible in the list ?

Please help.

Thanks

Sanket

Custom skill code to find point-point Resistance in layout

$
0
0

Hi,

Could anyone share the skill code to find point-point Resistance in layout? I hardly have an idea how this is gonna work, but i'm sure this might need to use layout extraction once you trigger the find R in the code. I'm not sure there is another way to actually find this. Any help?

Thanks

Sooraj

creating library from command line: dbCreateLib cannot find cds.lib

$
0
0

I am wanting to kick off SKILL scripts from the command line, and I've quickly run into an issue. I've attempted this in 6.1.5 and 6.1.7.


I have a SKILL script called 'hello.il' which all it has is

lib_id = dbCreateLib("hello", "cadence_libs/hello")

I kick cadence off with the below command

virtuoso -nograph -restore /path_to_file/hello.il

I get the output

*WARNING* Couldn't get an exclusive lock for "/path_to_run_dir/cds.lib.new"
    Permission denied
*WARNING* (DB-270165): dbCreateLib: cannot create library 'hello'  because ddCreateLib: Could not open '/path_to_run_dir/cds.lib.new' for output.

This creates a file called 'cds.lib.new' in the run directory, but does not add anything to it and does not add anything (Specifically wanting a DEFINE for hello) into the cds.lib file. It does create the cadence_libs/hello directory though ( I do not know if it is correct). Just doesn't update the cds.lib.

In the manual for ddCreateLib it says it bases the cds.lib file off of 'ddUpdateLibList'. Running ddUpdateLibList() passes fine. I've also tried using ddSetForcedLib and the command line flag -cdslib to force it to "cds.lib".

I do not have this issue if I try running the script from the ciw.

If these are just warnings I could in theory just put the names into the cds.lib file after this script, but it would be cleaner if it were through cadence.

Any ideas as to what is going on?


Thanks

-Matthew

Viewing all 5074 articles
Browse latest View live


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