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

Compare text files stored as a cell view

$
0
0

Dear all,

In my library manager, each cell has two or more views that are pure text. These text views store DRC and LVS results. As the PDK changes, I have to compare each DRC/LVS for the current PDK version against the previous one.

I thought that one way to solve this could be done in a similar way to the unix command "diff". In first place, I should have a GUI where the users enter the 2 views that he/she want to compare. Now the problem starts here. How can I get the location of each view to be able to do the comparison ? After having the files, which is the best way to compare them ? Is it, then, possible to save the result into the library manager as a new view ?

Thanks in advance.

Best regards,

Pedro


How to get the lowerLeft & upperRight coordinate from 4000 or more shapes which layer is "ME1" ?

$
0
0

Hi All,

I do not want to get CellView bBox as  Maximum bBox  , even it 's fast (for  many layers、object .... )

I want to get the lowerLeft/upperRight for all shapes(4000 or more) which lpp is "M1"  CellView bBox.

How to do it ?

 

Thank you,

Charley

 

Need an advise: which is the most continent way to save dumped data to a table?

$
0
0

Hi all,

I want to save the dumped data from PCell to a file (table), and there are many ways, which one you would suggest? Just create a table or maybe more advance f.i. JSON?

As an exmaple of my data:

cv~>master~>superMaster~>... 

( "50n" "FALSE" "1u" .....)

Kind regards,

Vadim

Import spice netlist to Virtuoso

$
0
0

Hi

I ma not sure this question is suitable for this forum. I want to import spice netlist into Virtuoso. Is there any application note or user guide for the conversion ?

I need to map devices in spice netlist to symbols.

Thanks,

ManChak

schematic creation using SKILL

$
0
0

Hi,

Can anyone help me in writing a SKILL code for creating a schematic of a basic circuit??

I have the netlist of the required circuit.

Based on the suggestions you give for creating a basic circuit, I can write for my schematic.

Regular Expressions

$
0
0

Hi all,

Can anyone help to solve the problem ?

I've got a library (shem) with lots of cells. Each cell contain schematic view and a symbol. If the name of the cell begins with "dff" or "lat" i need to run df procedure, if it doesn't, i have to run pn procedure. But i stuck with regular expressions for that.

Here is the code:

l=ddGetObj( "shem")~>cells
v = listToVector( l)
for( i 0 (length( l)-1) ddGetObjName( v[i])
    case(ddGetObjName( v[i])
        (rexMatchp("^dff*")
        df( ddGetObjName( v[i])))
        (rexMatchp("^lat*")
        df( ddGetObjName( v[i])))
        (t
        pn( ddGetObjName( v[i])))
);case
);for


df and pn procedures use cellName as a parametre.

Maybe there is anothe wey to get cellNames from the library ?

containce
containce
containce
containce
containce

How do you set a SKILL variable value to a shell evaluation?

$
0
0

Using v5141, I am trying to set a SKILL variable value to be the result of a shell evaluation (which should return a text string). 

The shell operation is on a file generated during the Virtuoso session, otherwise it could be set in the .cdsinit or shell prior to running Virtuoso.

For example in Virtuoso I have just generated a log file:

myvar=system("grep myword mylogfile")

The system (or shell) command will write the text string to stdout of the shell, but puts the return value of the system() process into the SKILL variable.

While the shell will display the result of the grep operation (eg "myword"), the CIW gets a process return value, not the result of the grep.

printf("%L" myvar) ==> 0

I have tried using setShellEnvVar() to assign the variable to be in the shell and then reading it in.

setShellEnvVar("myvar=`grep myword mylogfile`")

But getShellEnvVar() returns the literal unevaluated string, not the shell evaluation.

getShellEnvVar("myvar") ==> "`grep myword mylogfile`"

How do you assign a SKILL variable value to the the string result of a shell operation like grep?

PARSING IN SKILL

$
0
0

Hi,

can anyone help me in parsing a file using SKILL??

I have a text file, and from that I have to extract data.

how to proceed?

regards


PARSING A NETLIST

$
0
0

hi 

I have a netlist.

I want to parse the contents in that netlist and store the contents in a data structure.

can I get a code for this.

regards

teja

Most efficient db function to move all shapes in a design?

$
0
0

Working in ic5141, what is the most efficient way to move all shapes in a design using the db functions?

I'm dealing with millions of shapes and would like to use a function like Move Origin, but this is not a db function.

Is it more efficient to create a figure group, add each shape to the group and move the group, or to select and move each shape?

Neither seem like good options for a list of millions of shapes.

what is the difference between 'rex' and 'pcre' SKILL regex functions ?

$
0
0

Hello experts,

I have a basic doubt regarding regex functions in SKILL. There are two set of functions which has suffix 'rex' & 'pcre'. I understand pcre stands for perl compatible regular expression. If someone explain it providing a small example, it will be very useful to understand it.

Thanks and Regards,

Manikandan Kuzandhaivelu

Select cell view from lib manager

$
0
0

Dear all,

I have a script which allows the user to select a cell view from the library manager, without opening prompting the user. The user selects, in first place, the cell view from the library manager and only then the user should press the button for the script to run. As this is counter-intuitive for some, I would like to have the opposite. When user clicks the "select" button it will open the lib manager, so the user can choose the cell view.

This is described in Cadence documentation, and an example is given for the "ddsUpdateSyncWithForm" command. However this method uses three text boxes (string fields) which get the values for lib, cell and view. But in my case, I would like to use a single text box instead of three, and I can't do it. I've tried to pass the values (lib,cell,view) with variables but it didn't work.

Second question. In the code, you can see that I have to identical "procedures". The only difference is that one is executed when button 1 is pressed and the second when button 2 is pressed. How can I detect which button has been pressed, so I can do a generic function for both.

 

Thanks in advance.

Best regards,

José

 

My code


;==============================================================================
;============================== main function ================================
;==============================================================================

procedure(main()
let((retValue)

; Create the form
retValue=CreateMainForm()
putprop( 'settingsForm 'myHelpCB 'hiHelpAction) ; Customize the information displayed by the Help button

declare(selectedViewArray[2])
selectedViewArray[0]=""
selectedViewArray[1]=""
);end let
) ; end procedure

;==============================================================================
;=============== Display main Form - Create Main form" =======================
;==============================================================================

procedure(CreateMainForm()
let((label1 doneButton settingsForm cellView1 cellView2 selectButton1 selectButton2 selectButton3 sep1)
; template loading and saving

label1=hiCreateLabel(
?name 'label1
?labelText "SUMMARY FILE'S COMPARISON"
?justification 'center
)

sep1=hiCreateSeparatorField(?name 'sep1)

cellView1 = hiCreateStringField(
?name 'cellView1
?prompt "Summary file 1 :"
?value "Please select a summary file"
?editable nil

)

cellView2 = hiCreateStringField(
?name 'cellView2
?prompt "Summary file 2 :"
?value "Please select a summary file"
?editable nil
)

selectButton1=hiCreateButton(
?name 'selectButton1
?buttonText "Select"
?callback "cb_button1_pressed()"
)

selectButton2=hiCreateButton(
?name 'selectButton2
?buttonText "Select"
?callback "cb_button2_pressed()"
)

selectButton3=hiCreateButton(
?name 'selectButton3
?buttonText "Compare !"
?callback "cb_button3_pressed()"
)


hiCreateAppForm(
?name 'settingsForm
?formTitle "Compare summary files"
;?callback list("testOK()" "testCancel()")
?buttonLayout 'Close
?fields list(
list(label1 10:10 600:0 40)
list(sep1 0:35 600:0)
list(cellView1 15:50 500:30 100)
list(cellView2 15:85 500:30 100)
;list(cellView2 300:8 55:30)
;list(selectLabel 15:70 45:20 200)
list(selectButton1 520:50 50:30)
list(selectButton2 520:85 50:30)
list(selectButton3 120:120 90:30)
) ; end list
) ; create form

hiDisplayForm(settingsForm) ; Display form
); end let
); end procedure


;==============================================================================
;=============== Select button1 pressed "cb_button1_pressed" ====================
;==============================================================================
procedure(cb_button1_pressed()
let((selectedView libName cellName viewName pathToSelectedView)
;printf("Test!")
selectedView=ddsGetLibManLCV() ; list containing the the "lib", "cell" and "view", when clicked in lib manager

; separate the list into different variables
libName=nth(0 selectedView)
cellName=nth(1 selectedView)
viewName=nth(2 selectedView)

if(rexMatchp("small_sum" viewName)==t then ; checks if "small_sum" exist in the name of the cell view
; outputs the path to the cell view in the list
pathToSelectedView=ddGetObjReadPath(ddGetObj(libName cellName viewName "*"))

; creates a string in the format "cellname -> viewName" and copies it to the textbox
sprintf(cellViewStr "\n%s -> %s" cellName viewName)
get(settingsForm settingsForm->cellView1->value=cellViewStr)
;printf("Button 1 pressed\n")
;printf(pathToSelectedView)

selectedViewArray[0]=pathToSelectedView

else
dispMessage("Cellview must be text !")

) ;end if
) ;end let

) ;end procedure


;==============================================================================
;=============== Select button2 pressed "cb_button2_pressed" ====================
;==============================================================================
procedure(cb_button2_pressed()
let((selectedView libName cellName viewName pathToSelectedView)
;printf("Test!")
selectedView=ddsGetLibManLCV() ; list containing the the "lib", "cell" and "view", when clicked in lib manager

; separate the list into different variables
libName=nth(0 selectedView)
cellName=nth(1 selectedView)
viewName=nth(2 selectedView)

if(rexMatchp("small_sum" viewName)==t then

; outputs the path to the cell view in the list
pathToSelectedView=ddGetObjReadPath(ddGetObj(libName cellName viewName "*"))

; creates a string in the format "cellname -> viewName" and copies it to the textbox
sprintf(cellViewStr "\n%s -> %s" cellName viewName)
get(settingsForm settingsForm->cellView2->value=cellViewStr)

;printf("Button 2 pressed\n")
;printf(pathToSelectedView)
selectedViewArray[1]=pathToSelectedView

else
dispMessage("Cellview must be text !")
) ;end if


) ;end let
) ;end procedure

;==============================================================================
;=============== Compare Button "cb_button3_pressed" ====================
;==============================================================================
procedure(cb_button3_pressed()
let((str)

; checks if both textboxes aren't empty
if(cellView1->value!="Please select a summary file" && cellView2->value!="Please select a summary file" then
str=sprintf(test "tkdiff %s %s" selectedViewArray[0] selectedViewArray[1]) ; string having the full command to be executed in the shell

csh(str) ; executes the command on linux shell

; Re-initialise text boxes after closing tkdiff editor
get(settingsForm settingsForm->cellView1->value="Please select a summary file")
get(settingsForm settingsForm->cellView2->value="Please select a summary file")
else
dispMessage("Please select two views to be compared !!" )
) ;end if

) ;end let
) ;end procedure

;==============================================================================
;===================== Display Message "dispMessage" =========================
;==============================================================================
procedure(dispMessage( message )
hiDisplayAppDBox(
?name gensym('mybox)
?dboxBanner "Message"
?dboxText message
?dialogStyle 'modeless
?dialogType hicMessageDialog
?buttonLayout 'Close
) ; hiDisplayAppDBox
); End procedure


;==============================================================================
;===================== Building myHelpCB funtion =============================
;==============================================================================

procedure(myHelpCB(arg1 arg2 arg3 arg4)
let((helpStrMsg)

; Help Message
helpStrMsg="\n\
DESCRIPTION\n\
\tSummary file 1 - first summary view selected from the lib manager\n\
\tSummary file 2 - second summary view selected from the lib manager\n\
\t\"Select\" buttons- retrieve the name of the selected views from the lib manager\n\
\t\"Compare\" button - triggers \"tkdiff\" from linux in order to compare both views\n\n\
SUMMARY: \n\
\t1 - Click on the desired cell view from the \"Library manager\"\n\
\t2 - Click the correspondent \"Select\" button.\n\
\t3 - Hit the \"Compare\" button.\n"


hiDisplayAppDBox(
?name gensym("dbox")
?dboxBanner "compViews script HELP"
?dboxText helpStrMsg
?dialogType hicInformationDialog
?dialogStyle 'modeless
?buttonLayout 'Close
)
)
)



Plotting disconnected marker lines (mask) on an eye diagram

$
0
0

Hi,

Prior to Virtuoso 6.1.7, I was able to add disconnected lines to an eye diagram by creating a waveform which contained a special "invalid" y-value of -2e+37 at the point where I wanted to break the line. I found this trick in a post to this forum by Andrew Beckett.

An example of the X and Y vectors used to create a set of marker lines is (I've tried to uses spaces to align the x and y values) is:

X: (0.0       0.0             3.571429e-11 3.571429e-11 3.571429e-11 7.142857e-11 7.142857e-11 7.142857e-11 7.5e-11      1.071429e-10)

y:(-2e+37 4.810022 4.810022         -2e+37              1.738277        1.738277         -2e+37               2.870995         2.870995 -2e+37)

Each section between the -2e+37 values marks a separate line segment. This sequence creates 3 separate marker lines. Two that span the whole eye diagram to mark the high/low signal levels and one that is only a short stub on one side to mark the crossing point).

After moving to 6.1.7, the special invalid y-value no longer appears to work. The three lines are plotted but a vertical line appears along the plot edge that  descend to -2e37 (luckily the y axis range in unaffected by this value). The three line segments are no longer disconnected.


Version 6.1.7 does add a new eye mask function that could be used to replace some of my function's functionality (I use the same technique to create an eye mask) does not allow things such as marker lines to be added..


Any suggestions of how I can create a waveform with disconnected line segments that can be plotted using eyeDiagram?


An example of an (ugly) eye diagram with the marker lines (green) superimposed is shown below. (this is the 6.1.7 version). (As a side note, the "Dotted" lineStyle also appears broken in 6.1.7.8, at least for eye diagrams, causing Viva to hang.)


Thanks.

Ivars

How to set leTreeForm->treeOption->value in IC 6.1.7 (ISR7) or above ?

$
0
0

Hi All ,

In IC 6.1.7 ,for first time ,  use boundp('leTreeForm) , it return t , Assume it has form structure (IC 6.1.6 is that)

but  use  leTreeForm->treeOption->value , it return nil (IC 6.1.6 , it return data ...)

I want to  make sure currently  value from leTreeForm->treeOption->value  and re-set ,

If i leTreeForm->treeOption->value = "Current to stop level"  , it appears  *Error*  putprop:  first arg must be either symbol,list,defstruct or use type - nil

If i launch  leHiTree() , everything is OK.

How to do it ?

 

Thank you,

Charley

Launching ADE L fails when simulator set to eldoD_sp in cds.env

$
0
0

Hi,

I have installed IC616, Mentor Graphics AMS and Artist Link to integrate Eldo simulator with Virtuoso. I have followed the installation steps carefully as per the documentation. I have set  "eldoD_sp" as the default simulator in .cdsenv.

When I try to launch ADE L from Schematic Editor window, ADE doesn't open and I see following message in command window.

*WARNING* hiCreatePulldownMenu: The menu must contain at least 1 entry
*Error* putprop: first arg must be either symbol, list, defstruct or user type - nil
<<< Stack Trace >>>
(... in sevHiSetDisableCallback ...)
(... in sevHiCreatePulldownMenu ...)
(... in sevPulldownMenu ...)
(... in unknown ...)
(... in sevCustomMenus ...)
(... in sevMainWindowPulldownMenus ...)
(... in sevCreateMainWindow ...)
(... in sevStartSession ...)
(... in sevSchematicArtistPulldownMenus ...)
apply(artSchematicArtistPulldownMenusFunc() list(args))
let((simulatorchosen design) if(((args->window)->sevSession) then (simulatorchosen = sevSimulator(((args->window)->sevSession))) else (design = sevDesignInSchematic((args->window))) ... ) cond(((simulatorchosen == "ams") unless(deFindPlugin('amsaAMSPlugin (args->window)) _artInstallPlugin((args->window) 'amsaAMSPlugin))) (rexMatchp("Verilog$" simulatorchosen) unless(deFindPlugin('artVerimixPlugin (args->window)) _artInstallPlugin((args->window) 'artVerimixPlugin))) (t when(deFindPlugin('artVerimixPlugin (args->window)) deRemovePlugin((args->window) 'artVerimixPlugin)) when(deFindPlugin('amsaAMSPlugin (args->window)) deRemovePlugin((args->window) 'amsaAMSPlugin)) when(deFindPlugin('ddsgHEDPlugin (args->window)) deRemovePlugin((args->window) 'ddsgHEDPlugin)))) apply(artSchematicArtistPulldownMenusFunc() list(args)))
(... in _deApplyTrigger ...)
(... in unknown ...)
funobj@0x18ddaf48()
(... in _dePullTrigger ...)
(... in _deCallMenuTrigger ...)
(... in unknown ...)
(... in __deMakeBannerMenus ...)
(... in __deInstallNewAppInWindow ...)
(... in __deInstallApp ...)
(... in deInstallApp ...)
deInstallApp(hiGetCurrentWindow() "analogArtist-Schematic")
*WARNING* (DEBASE-102079): A SKILL error occurred in function artMenuTrigger

 If the default simulator is set to "spectre", ADE can be launched. But as soon as "eldoD_sp" is set as simulator in the setup menu, the same error occurs and the menus in the menubar disappears on ADE L window.

Could anyone point me in right direction to figure this problem out. I had just one custom skill file in the setup and I have disabled loading of it in .cdsinit to make sure it wasn't the reason for this error.

Thanks,

Ashwin

SacState MS lab


Pcell generation for different views

$
0
0

Hello,

I have noticed that in analog library ( $CDSHOME/dfII/etc/cdslib/artist/analogLib) for every cell there are different views (auCdl, auLVS, spctre, hspice, e.t.c). I am currently developing a pcell for our own devices (nmos, pmos, capacitors and resistors). My question is should I create layout and symbol view via SKILL and rest of the views should be generated manually or the SKILL code should generate all of the views ?. Also, why there is auCDL, auLVS , hspice and spectre views are there? Any document that could help me understand there function in the view ?

Thanks

Farhan

Problem using autovia with custom standardViaDefs

$
0
0

I have a problem using auto-via. I have seen some similar problems on this forum, but none of the solutions seem to work.

The vias I want to use must be compliant with DFM rules, so the standard via defs are not DRC clean.
 I have created new standardViaDefs with the correct spacing/enclosure, and a constraint group where only the DFM standardViaDefs are valid.

I start the autovia command, the constraint group is set to DFM, but still the vias have smaller spacings and enclosures as defined in standardViaDefs. They seem to be taken from the techno rules.

What is wrong here?

My CDS version is ICS6.1.7-64b.500.8

Change symbol in schematic

$
0
0

Hi Experts!!

Please help me.

I made a schematic. It has a 50 symbol in schematic.

I want to change these symbols to all another symbols.

(just one-key solution or skill solution)

For example, if there is inv_2x symbol, I would like to change it nand2x or another symbol.

I want simple solution.

Thank you!

How to call an instance into layout

$
0
0

Hi,

I am writing a program to call the devices from the technology library (P cells) using the following code

master=dbOpenCellViewByType("cmos28g" "nfet" "layout")    ;cmos28g is the library, nfet is the cell name and layout is view name

paralist=list(list("W" "float" "0.5") list("L" "float" "0.5"))

dbCreateParamInst= (geGetEditCellView() master "instname"  list(0 0) "R0" 1 paralist)

By excuting this program I am getting the instance in my layout but not with the parameters that I specified. It is coming with the same parameters that are in the original layout (i.e., in the cmos28g library layout).

Is there anything wrong in the program ?  (or) Do I need to include anything else?.  Please clarify it.

Thanks.

Cannot call pPar for CDF parameter

$
0
0

Hello,

I wrote a pcell for layout and Symbol view for nmos. There are only 2 parameters that user can define (W and L). These CDF parameters have simple call backs functions to check that value in non zero. When I place the instance of nmos symbol in another schematic and edit the parameters at pPar("W") and pPar("W") then I get the error that:

*WARNING* cdfiSetParamValueOnInst: Could not get a float from property 'W' on instance 'I2'

CDF: An error occurred when evaluating callback.

Callback: W->callback => CheckLW(cdfgData->W)

Message: *Error* eval: undefined function - pPar


I tried changing the formal parameters of symbol view as:
 (
        (W           string   "75e-6"     ) ;; Channel Width
        (L            string  "20e-6"     ) ;; Channel Length
    )

but still it doesn't accept the input as pPar. Can anyone help me what should I modify in CDF parameters to make pPar work ?

My CDF parameter code
cdfId = cdfCreateBaseCellCDF( cellId )

    cdfCreateParam( cdfId
        ?name "W"
        ?prompt "Channel width"
        ?defValue "100e-6"
        ?type "string"
        ?display "t"
        ?parseAsNumber "t"
        ?units "lengthMetric"
        ?callback "CheckLW(cdfgData->W)"
        ?storeDefault "yes"
    )
    cdfCreateParam( cdfId
        ?name "L"
        ?prompt "Channel length"
        ?defValue "20e-6"
        ?type "string"
        ?display "t"
        ?parseAsNumber "t"
        ?units "lengthMetric"
        ?callback "CheckLW(cdfgData->L)"
        ?storeDefault "yes"
    )

Thanks

Farhan

Viewing all 5066 articles
Browse latest View live


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