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

Incorrect value when replacing parameters using SKILL command

$
0
0

Hello,

I have the following code so that I can add/create a specific device on a schematic. It also changes the cdf parameter so I can change the capacitance value and the Layout Indication of the device.

cvId = dbOpenCellViewByType( " MyLib" "Capa_CellView" " schematic" "" 'a)

symbol_capa = dbOpenCellViewByType( "Device_lib" "Capa_type" "symbol" "" 'r)

instId = schCreateInst( cvId symbol_capa "C0" 0:0 "R0")

inst = list(instId)

schReplaceProperty( inst "c" "0.1p" )

schReplaccePropertyy (inst "LayInd" "Soft" )

However instead of capacitance = 0.1p, the capacitance value is 0.032p (default value). I have also tried the replacing this one as 100f but it has the same result.

The version that I am using for this is setic617isr23

Also with the same code but the version is setic618isr13 I get the following error:

*Error* eval: unbound variable - cdfgData

*Error*  load: error while loading file -  "./capa/capa_view_0p1.il" at line 11

Line 11 : schReplaceProperty( inst "c" "0.1p" )

I have the CCSinvokeCdfCallbacks(cvId) in the later part of the code. So I don't think the callback of this specific parameter is affecting the code.

For context this is the info in the cdf.

Name : c

Type: string

Default : 0.032p

For now I have only encountered this in capacitor device (MOS and BJT are OK in both version with the same code structure).

Please Help. Thank you.


abeLayerTouch result question

$
0
0

Greetings,

 I have a script which takes as input a string expression like this "PC touch CA touch M1 touch (...)"  etc. This expression can have arbitrary length and represents connectivity information. I created a parser based on Advanced Boolean Engine (abe) routines to check if the expression evals to t/nil. For 'touch' operation I use abeLayerTouch which works perfectly fine:

abeLayerTouch( abeLayer1 abeLayer2 abeResult )

The issue I have is that the resultingabeResult contains only the tiles fromabeLayer1 that touch abeLayer2. But for my purpose, I need to continue checking using the entire islands from abeLayer1 that touch segments from abeLayer2

QUESTIONS:

  1. Is there a way for abeLayerTouch to return the entire island (aka polygon) instead of just the partitioned tile ?
  2. If not, any suggestions for alternative way to get what I want? I was trying to come up with a solution entirely within ABE realm, because of how quick it is. However, I finally resorted to loops and geometry.
  3. Are the islands in geoLayer OR abeIslandIterator sorted by default for number of points?
  4. For checking if a concave polygon is touching a rectangle, I couldn't find anything better than dbPointArrAnd, any ideas here? It felt really slow since for some reason it requires cellView and moreoever, I don't need it to return the overlapping area, I need boolean answer. So I wrote a 2 step algorithm, which profiled and turn out to better:
    1. Check if the sum of radiuses (r1 + r1) of smallest enclosing circle around two polygons is less then the distance between the circle center points L. If L>r1+r2 then polygons don't touch and stop here.
    2. Else check if at least one line N of polygonA is crossing|abutting line K of polygonB. If yes - polygons are abutting or straddle stop here.
      NOTE: This algorithm does not detect when polygonB is entirely inside polygonA without any abutting or crossing lines. However, this is not possible for my scenario with the abeLayerTouch.

 I ended up writing my own abeLayerConnect proc that performs what I need, but it can get slow with large number of polygons/islands and/with many points. I basically perform a standard abeLayerTouch, then for each tile from abeResult I check if it belongs to any islands from abeLayer1, if yes - I put them into a new abeLayer using abeLayerOrPtArray and continue with my expression using this new layer.

abeLayerTouch(abeLayer1 abeLayer2 abeResult)
;# Create array filled with tiles (threat tile as polygon for consistency)
ii=abeIslandIterator(abeResult)
tilesCount = ii->count
declare(aTiles[tilesCount])
for(i 0 tilesCount-1 aTiles[i] = ii->next)
;# Create array filled with polygons/islands
ii=abeIslandIterator(abeLayer1)
polysCount = ii->count
declare(aPolys[polysCount])
for(i 0 polysCount-1 aPolys[i] = ii->next)
;# Iterate over each polygon and check if a tile is touching.
;# If yes - add the polygon points to a new cumulutive abeLayer using abeLayerOrPtArray and 'remove' it from array. Remove the tile as well
;# because one tile can be part of exactly 1 polygon/island. Stop the loop and retry with new reduced number of polygons and tiles.
;# If no - just remove it from array -> none of the tiles were part from this particular polygon.
abePolys = abeNewLayer()
while(!zerop(tilesCount) || !zerop(polysCount)
  prog( (polygon tile)
    for( i 0 length(aPolys)-1
      polygon = aPolys[i]
      when(!eq(polygon 'unbound)
        for(k 0 length(aTiles)-1
          tile  = aTiles[k]
          when(!eq(tile 'unbound) && dbPointArrAnd(cv list(polygon) list(tile)) ; OR my custom made function which is actually faster
           abeLayerOrPtArray(polygon abePolys)
            aPolys[i] = 'unbound
            aTiles[k] = 'unbound
            tilesCount-=1
            polysCount-=1
            return(t)
          ); when
        ); for k
      ); when
      aPolys[i] = 'unbound
      polysCount-=1
    ); for i
  ); prog
); while
abePolys

Any tips and/or ideas are appreciated. Thank you!

Veriloga Convergence Issues with DFF

$
0
0

I am using the code below for a d-flip-flop. Its basically copied from designersguide.com and modified. It seems that there are convergence issues depending on whether V(qb,gnd) is defined or not. Could you guys please provide some guidance on what might be happening here?

Thanks!

`include "constants.vams"
`include "disciplines.vams"

// d flip flop with reset (reset is active high) and parameterizable initial state
module dff2 (clk, d, reset, q, qb, gnd);

input clk, d, reset; output q, qb; inout gnd;
voltage clk, d, reset, q, qb, gnd;
parameter real v0=0;
parameter real v1=1 from (v0:inf);
parameter integer dir=1 from [-1:1] exclude 0;
parameter real td=0 from [0:inf);
parameter real tt=0 from [0:inf);
parameter integer init_state=0 from [0:1];
integer actNow, out, state;
real thresh;

analog begin
    thresh = (v0+v1)/2;
    actNow = 0;
    @(initial_step or cross(V(clk,gnd) - thresh, dir)) begin
        actNow = 1;
    end
    out = idt(0, V(d,gnd)>thresh, actNow);
    V(q,gnd) <+ transition(out ? v1 : v0, td, tt);
    V(qb,gnd) <+ v0 + v1 - V(q,gnd);
end
endmodule

"Error Report"

**************************************************************
Periodic Steady-State Analysis `pss': estimated fund = 650 MHz
**************************************************************
Trying `homotopy = gmin'.
Trying `homotopy = source'.
Trying `homotopy = dptran'..
Trying `homotopy = ptran'..
Trying `homotopy = arclength'.
None of the instantiated devices support arclength homotopy. Skipping.

Error found by spectre during DC analysis, during periodic steady state analysis `pss'.
ERROR (SPECTRE-16080): No DC solution found (no convergence).

The values for those nodes that did not converge on the last Newton iteration are given below. The manner in which the convergence criteria were not satisfied is also given.
Failed test: | Value | > RelTol*Ref + AbsTol

Top 10 Solution too large Convergence failure:
V(u65:idt0) = 0 V
update too large: | -1 V | > 0 V + 1 uV
Top 10 Residue too large Convergence failure:
V(u65:idt0) = 0 V
residue too large: | -1 V | > 5 mV + 1 uV

"

Extract metal layer for all pins

$
0
0

I am trying to extract some of the information you get from exporting a LEF file by using SKILL. I have found a post(locating all layout pins via skill (google.com)) explaining how to extract pin names and dimensions, and it works like a charm. Is there a similar parameter to add, to extract the metal layer of each pin?

Also, is there some way I can view the sub categories of the 'cv'-object? Like the dir() command in Python.

How to enable dynamic back-annotated properties based on CDF parameter values.

$
0
0

Hello,

I've been playing around trying to create somehow dynamic back-annotation for SiPh devices, because there are simply too much useful properties to display.
I decided to explore the possibility to switch between TE / TM mode and Forward / Reverse signals, using some CDF parameters on the schematic side:

And then link these values within the expressions in the opParamExprList in the CDF like that:

This might be controversial, but seems to work and display the selected results when a simulation is run:

My motivation behind this is to provide a way of easily selecting the set of signals to be annotated based on their mode and direction, without the need for constant customization for each device.
The list of useful properties is quite long and I am looking for a way to group them by the signal mode and direction directly from the CDF:

The problem that I have is that when the value of these parameters is changed, the annotation is not getting updated dynamically. I've found out that re-running the simulation also triggers the
back-annotation and it shows properly. Since these parameters are not affecting the simulation at all, I want to bypass the need to do so. I've tried pretty much I could to try and re-evaluate the
properties, but without any success. 

Initially, I thought that simply changing the type of back-annotated properties, and then setting it back to the desired one within the callbacks of the CDF parameters will do it, but it doesn't.
It seems to be smarter than that and "remembers" that this set has already been shown and displays it again without re-evaluating it.

To put it briefly, I have two general questions:

1) Is there something I can put within a callback of a CDF parameters, so it can trigger re-evaluation of the expressions in the opParamExprList for the current device in the schematic?

2) Is there a way to enable dynamically evaluated property names for the back-annotation? It seems that the property names are treated as literals and I was not able to find a way to treat them as expressions.

3) Is there a way to annotate properties, which does not evaluate to a number? According to the documentation, if the expression does not evaluate to a number, which can be shown using the alphanumeric
notation, the result will simply not be displayed. I still think that there are several occasions in which I could leverage displaying some text.

As you can see in the pictures above, I was able to bypass the restrictions from questions 2 and 3 to some extend, but it has no significant value if I cannot force re-evaluation of the back-annotated properties from the CDF.

I would love to hear any advice or suggestion how I can perform whatever happens after a given simulation completes and the schematic / annotations get updated, from within a CDF callback.

Regards,

Petar Todorov

modifying elements of a list in a foreach loop

$
0
0

How would one modify the list elements using a foreach loop?

For example :

L1=list('("a" "b"))

L2=list('("c" "d"))

L3=list('("e" "f"))

foreach( l list(L1 L2) l=append( l L3 ))

The foreach loop processes the index variable "l" each time but does not modify the value of the list elements L1 & L2. 

Rod align warning ROD-1055 and ROD-1075

$
0
0

Getting rod warnings from pcell layout code and the result is a broken layout.

The pcell compiles with no errors or warnings and an initial placement of the pcell looks perfect. However, while editing parameters I will see the following warnings.

*WARNING* (ROD-1055) rodAlign: Reference object rodObj:808548320 named S0 not in cellView db:0x24cf221a named nmos4
*WARNING* (ROD-1075) rodAlign: command failed in "<lib>/<cell>/layout"
*WARNING* (ROD-1055) rodAlign: Reference object rodObj:808548320 named S0 not in cellView db:0x24cf221a named nmos4
*WARNING* (ROD-1075) rodAlign: command failed in "<lib>/<cell>/layout"

The <cell> is a mos device placed with Inst = dbCreateParamInstByMasterName(... and <lib> is the tech library.

This pcell which instantiates <cell> is not being compiled in the tech library. Don't think that matters.

After placing the mos device and use rodGetObj(Inst) to make a rod object from the instance. I then create two shapes and attempt to align them to the instance.

    gateConnLeft  = rodCreateRect(?cvId cvId ?layer "poly" ?width 0.4 ?length 0.6)
    gateConnRight = rodCreateRect(?cvId cvId ?layer "poly" ?width 0.4 ?length 0.6)
    rodAlign(?alignObj gateConnLeft ?alignHandle "upperLeft"
             ?refObj rodInst ?refHandle "upperLeft" ?xSep 0.17 ?ySep -0.16)
    rodAlign(?alignObj gateConnRight ?alignHandle "upperRight"
             ?refObj rodInst ?refHandle "upperRight" ?xSep -0.17 ?ySep -0.16 )

The intent is simply to align the rectangles at the upper left and right corners on the instance with some offset and it works fine until it does.

After a few edits the warning begins and the rectangle objects appear as if they are being placed and then rotated 90 degrees. It's the strangest thing I've ever seen.

Complete code:

procedure(switchPcell(@key w l nf polyPitch)
  let( ( cvId length width gatePitch fingers drainSourceWidth tfName tfId contactWidth
          con2Poly con2PolyS con2PolyD con2Edge polyRailWidth gateConnWidth gateConnLength
          contact2Edge gateConnLeft gateConnRight totalLength Inst)

    cvId = pcCellView
    ;cvId = geGetEditCellView()

    ; variables generated from parameters
    length = evalstring(l)/1u
    width  = evalstring(w)/1u
    gatePitch = evalstring(polyPitch)/1u
    fingers = evalstring(nf)

    ; derived variables
    drainSourceWidth = gatePitch-length
    ; contact width extracted from technology
    tfName = techGetTechLibName(ddGetObj(cvId~>libName))
    tfId = techOpenTechFile(tfName "tech")
    contactWidth = techGetParam(tfId "contact_width")
    con2Poly = (drainSourceWidth-contactWidth)/2
    polyRailWidth = 0.48
    gateConnWidth = 0.4
    gateConnLength = 0.6
    con2Edge = 0.072
    totalLength = (fingers-1)*gatePitch+2*(con2Edge+contactWidth+con2Poly)+0.18+length

    ; derived or hard-coded variables for nmos4 parameters
    con2PolyS = con2PolyD = sprintf(nil "%gu" con2Poly)
    contact2Edge = sprintf(nil "%gu" con2Edge)

    Inst = dbCreateParamInstByMasterName(
      cvId
     <lib>
     <cell>
     "layout"
      "S0"
      width:0
     "R90"
      1
      list(
        list("w" "string" w)
        list("l" "string" l)
        list("nf" "string" nf)
        list("advlay" "boolean" t)
        list("con2PolyS" "string" con2PolyS)
        list("con2PolyD" "string" con2PolyD)
        list("contToEdge" "string" con2Edge)
      ) ; parameter list
      t
    ) ; place nmos4
    rodInst = rodGetObj(Inst)

    ; create and align gate connections
    gateConnLeft  = rodCreateRect(?cvId cvId ?layer "poly" ?width gateConnWidth ?length gateConnLength)
    gateConnRight = rodCreateRect(?cvId cvId ?layer "poly" ?width gateConnWidth ?length gateConnLength)
    rodAlign(?alignObj gateConnLeft ?alignHandle "upperLeft"
             ?refObj rodInst ?refHandle "upperLeft" ?xSep 0.17 ?ySep -0.16)
    rodAlign(?alignObj gateConnRight ?alignHandle "upperRight"
             ?refObj rodInst ?refHandle "upperRight" ?xSep -0.17 ?ySep -0.16 )

    ; create body connections
    rodCreatePath(?cvId cvId ?layer "metal1" ?width 0.16
                             ?pts list(-(polyRailWidth+0.12):-0.37 polyRailWidth+0.12+width:-0.37))

  ) ; let
) ; procedure

Made edits to the above procedure to hide certain info.

A function like lastVal but for the y-axis

$
0
0

Is there a way to get the value on the y-axis corresponding to the lastVal on the x-axis?

I mean, lastVal gets you the last value on the x-axis... is there a similar function but for the y-axis to get the last value on it?


How to set Pin text layer base on LSW select layer

$
0
0

Dear,

I want to set a auto pin text layer while create pin on different metal layer. 

For example, create pin use "M1:pin" and its pin text layer is "M1:net", since there is a case different layer to one Pin text case. So I can't simply to use "Same As Pin" option in "Set Pin Label Text Style“ form. 

Below  is my code, but it is not work on my request. Could you help to let me know the problem?

procedure(setPinText()

 let((layer purpose)

     case(leGetEntryLayer()

             ('("M1" "pin")  layer = "M1" purpose = "net")

             ('("M1_Match" "pin")  layer = "M1" purpose = "net")

             ('("M2" "pin")  layer = "M2" purpose = "net")

             ('("M2_Match" "pin")  layer = "M2" purpose = "net")

             ('("PAA" "pin")  layer = "AA" purpose = "net")

             ('("NAA" "pin")  layer = "AA" purpose = "net")

      );case

hiEnqueueCmd("le0PinSetNameDisplayForm->pinTDLayerName->value = layer")

hiEnqueueCmd("le0PinSetNameDisplayForm->pinTDPurposeName->value = purpose")

leHiCreateChoice0fPin()

);let

);procedure

hiSetBindKey("layout" "Alt<key>p" "setPinText()")

After my test, it can active change on leiDisplayPinNameDisplayForm(), but modied value can't keep to work on create pin form. 

My tool version is IC618. thanks for your help!

About method to distinguish mouse inpust.

$
0
0

Hi. sir

Honestly I asked about this problem a few days ago. But I could not get answer...

So I organized the questions and uploaded them again.

I'm making some automation utility in Virtuoso Layout.

Fisrt, leRoutingAssistance can automatically modify property of selected two objects (Select two objects with two mouse clicks).

Second, if there are many object to choose from, using leRouitngAssistance_Multi. It allows you to select multiple objects at once by dragging mouse.

The algorithm for the function is as follows.

-------------------------------------------------------------------------------------------------------------------------------------------------------------

leRouitngAssistance Start --> Mouse click to 1st object --> get data of 1st object
--> Mouse click to 2nd object --> get data of 2nd object

--> Compare 1st / 2nd object, 1st / 2nd click point and modify property

--> leRouitngAssistance END

leRouitngAssistance_Multi --> Mouse drag --> get data of objects

--> Compare the all selected objects and modify property

--> leRouitngAssistance_Multi END

-------------------------------------------------------------------------------------------------------------------------------------------------------------

Each function was completed through Enterfunction. But I want combine function of each to only one function like the algorithm below.


Function Start
==> if Mouse click to 1st object --> After that, proceed in the same way as operation leRouitngAssistance
==> if Mouse drag --> After that, proceed in the same way as operation leRouitngAssistance_Multi

currently i use bindkey and enterfuction bindkey like this : list("<Key>D" "leRoutingAssistance()" "cancelEnterFun() leRoutingAssistance_Multi()")

It may be greedy, but I want to reduce what I have to input the keyboard twice to one. So I want to distinguish the mouse input.

Is there any way to solve this problem?

====================================================================================================

Please understand that we only brought the core part of the code for readability.

procedure(leRoutingAssistance()
prog((layerData rtData)

unless(boundp('RoutingAssistanceForm)
RoutingAssistanceOptionForm()
); unless

enterPoints(
?prompts list("First Object" "Second Object")
?form RoutingAssistanceForm
?wantPoints 2
?initProc "initProc_setSelectMode" ;; EnterFunction select mode = dynamic highlight on
?doneProc "doneProc_RoutingAssistance" ;; Function to automatically change property of selected objects
?addPointProc "addPointProc_getSelectObj" ;; gets the information of the objects selected by the mouse click(using geGetSelSet() )
?noInfix ,window(1)->infix ;; Infix Mode T / Non Infix Mode nil
); enterPoins
) ; prog
); procedure

procedure(leRoutingAssistance_Multi()
prog((layerData rtData)

unless(boundp('RoutingAssistanceForm)
RoutingAssistanceOptionForm()
); unless

enterBox(
?doneProc "rtData = doneProc_RoutingAssistance_Multi" ;;
?noInfix ,window(1)->infix ;; Infix Mode T / Non Infix Mode nil
); enterBox
) ; prog
); procedure

isolate sub parts when getting shapes in a layout

$
0
0

I use the following to get a list of shapes on a specific layer in a layout

thisLayerShapes = setof(shapes geGetEditCellView()~>shapes shapes~>lpp == list("thisLayer" "drawing"))

It appears that geGetEditCellView()~>shapes includes all shapes on "thisLayer" that are sub parts of a multi-part path.

Is there a way to filter out all multi-part path sub parts?

Member object is 'nil' after using dbCreateInst in SKILL script, works fine in CIW

$
0
0

Hi,

I am automating the creation of many buffers in my schematic, however, I encounter this error:

buf_cv = dbOpenCellViewByType("techlib" "buffer_name" "symbol")

buf = dbCreateInst(cv buf_cv "test_buffer" list(inx iny) "R0" 1)

println(buf~>instTerms)

Where inx and iny are coordinate values assigned earlier. "techlib" and "buffer_name" are stand-ins for a tsmc standard cell library and the buffer cell. I don't understand why the last line, buf~>instTerms returns nil. If I go to the CIW and select the buffer schematic, and run:

css()~>instTerms

It gives the list of terminal objects as expected. What is causing the discrepancy and what's the solution? Thanks

About label fonts

$
0
0

Here is a label (Metal  pin)

I would like to ask if there is a way to make this label "bold" 

but keep the font [stick]

my virtuoso version is ICADVM18.1-64b.500.10

A question about pin label change text

$
0
0

Dear all,

while I do create pin, I need generate a pin and create label by text option turn on switch "Create As Label". 

Now I get a strange case, if I change the terminal name of pin shape. The label text can't be updated as well as pin terminal. 

If I create a pin without turn on "Create As Label". The label text can synchronous update with modify of pin terminal. 

My design request to turn on "Create As Label" since its character’s objType will be 'label'. And istead to use objType as 'textDisplay'.

I am painful on it, in order to let label text same as pin terminal, I have to modify twice.

Could you let me know if there is any solution on it. Thank you. 

My tool enviroment is IC618.

Best Regards

Tony

Convert String in Exponent format "280e-09" to a numerical format

$
0
0

Working on an Ocean script.

How do I convert exponential numbers to string. Example  "280e-09" to 280e-09

So that I can use it as an argument for awvPlaceXMarker function.

Regards,

Anchan


How to copy stdVia from lower level cell to top (according to some area) ?

$
0
0

Hi All,

Hierarchy layout cells and use many stdVia/customVia in each cell , How to copy each stdVia/customVia from bottom to top to a new cell ?

Support  asign bBox (all bBox / assign bBox  )

|---  Top Cell                                                            --->   Top Cell New

| -------A Cell /B Cell  (stdVia : M2_M1/M3_M2...)

|-----------C Cell .(stdVia : M2_M1/M3_M2...)

Thank you very much,

Charley

Ctrl+Shift+0 bindkey doesnt work on layout XL

$
0
0

Hi Everyone

For some reason this doesn't work for me:

hiSetBindKey("Layout" "Ctrl<Key>)" "printf(\"hello world\")")

Every key that use shift (such as ! , @ , # , $ ,etc..) works great with Ctrl. Only ")" doesn't work. I've tried many combinations to bypass this and failed. Can anyone please advise?

I'm using ICADVM20.1

Thanks!

Help me! How to SKILL activation in the background??

$
0
0

Hi. first, i'm sorry for my english is poor.

i want a window view bbox to be synchronize between window A and window B

1. Skill execute

2. Change the window-A bbox such as Zoom-in, Zoom-out, full fit... etc 

3. Window-B synchronized to the same bbox as window-A (Real time synchronization when view bbox change command is input in window-A)

Here, i think maybe SKILL should always activation for real time synchronization.

but, i don't know that SKILL activation in the background.

How to SKLL activation in the background?

Or, if you can tell me another way, thanks.

best regards.

Printing node voltages to excel

$
0
0

Hello all, I wanted to check if we have a utility /skill code to print the node voltages of a selected instance to excel or a text file, if I do save all , cdsTerm data will already be present in psf file, can we somehow parse the file and get all the cdsTerm pin voltages associated with a given instance, this way we can print all the data to a text or excel file by just selecting the instant , we need this so that we can easily document or compare the initial (or any intermediate transient ) state voltages across 2 test bench instances , currently I have to visually check the voltages between to test benches and this process is extremely inefficient and time consuming as the symbols can have >1000 pins.

Problem with tables

$
0
0

Hi everybody,

I'm having troubles with a table that is overwriting every Route value within the keys.

In this case I created the keys Skills and SetupSMIC
as it's shown, first they both have "a" in the Route parameter, then I set SetupSMIC route as "b"
but when printing skill route also get changed


And I created this two keys and they are working correctly 


Also I was working with another table like that and I didn't have that problem
the problem are the ones that was created this way, It looks like they have the same memory space.

Does anybody know what I'm doing wrong? 

getVersion()->virtuoso version 6.1.8-64b

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



Best regards,
R. Gómez

Viewing all 5093 articles
Browse latest View live


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