• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Custom IC SKILL
  3. the load pcell only show error marker

Stats

  • Locked Locked
  • Replies 6
  • Subscribers 143
  • Views 15245
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

the load pcell only show error marker

youcanred
youcanred over 5 years ago

Hi, 

I have a .il code of balun. When I load this code in the CIW, the CIW get 't' return. But the imported pcell shows nothing. When i call this pcell in other layout, it only shows a error marker. And when i 'Q' the error marker, i can see the parameters i wrote in. But only a marker, can't see the balun.

I checked all the log filter, it has a error shows: *error* techGetDeviceInClass: argument #1 should be a database object (type template  = 'dtt' ) - nil. I am not sure if this affacted.

I have no ideal how to solve this problem. And I hope someone could help me. thank you so much.

Best regards.

  • Cancel
  • Andrew Beckett
    Andrew Beckett over 5 years ago

    Well, there's a bug in your SKILL code. The first argument to techGetDeviceInClass needs to be a techdb object, and presumably whatever is finding that is failing and returning nil. I can't guess what's wrong since we've not seen your code. What probably ought to be happening is that the code finds that argument using techGetTechFile(pcCellView) or something like that, but I don't know how your code is structured or written, so this is a wild guess.

    Normally you would need to use something like Verify->Markers->Explain and click on the instance and this will give some detail - but my guess is that it will give the same error as you've seen.

    Regards,

    Andrew.

    • Cancel
    • Vote Up +1 Vote Down
    • Cancel
  • youcanred
    youcanred over 5 years ago in reply to Andrew Beckett

    Hi Andrew, the code is :

    pcDefinePCell(list(ddGetObj("ILFD") "ind_test" "layout")
    ((W float 8.8)
    (S float 6.6)
    (N float 3.0)
    (R float 27.0)
    )
    let(
    ()
    n=fix(N)
    ;************************main inductor*****************************

    (pcLayer = "UTM")
    (pcPurpose ="drawing")
    if(n==1
    then
    a=R+W/2+(W+S)*(n-1)
    b=a/(1+1.414)
    c=2+(W+S)/2
    cc=2+(12*1.1)/2
    list1=list(-cc:-a -b:-a -a:-b -a:b -b:a -c:a)
    list2=list(cc:-a b:-a a:-b a:b b:a c:a)
    (pcInst = dbCreatePath(pcCellView
    list(pcLayer pcPurpose)
    list1 W "truncateExtend"))
    (pcInst = dbCreatePath(pcCellView
    list(pcLayer pcPurpose)
    list2 W "truncateExtend"))
    else
    for(i 0 n-2
    a=R+W/2+(W+S)*i
    b=a/(1+1.414)
    c=2+(W+S)/2
    list1=list(-c:-a -b:-a -a:-b -a:b -b:a -c:a)
    list2=list(c:-a b:-a a:-b a:b b:a c:a)

    (pcInst = dbCreatePath(pcCellView
    list(pcLayer pcPurpose)
    list1 W "truncateExtend"))
    (pcInst = dbCreatePath(pcCellView
    list(pcLayer pcPurpose)
    list2 W "truncateExtend"))
    );for
    a=R+W/2+(W+S)*(n-1)
    b=a/(1+1.414)
    cc=2+(12*1.1)/2
    c=2+(W+S)/2
    list1=list(-cc:-a -b:-a -a:-b -a:b -b:a -c:a)
    list2=list(cc:-a b:-a a:-b a:b b:a c:a)
    (pcInst = dbCreatePath(pcCellView
    list(pcLayer pcPurpose)
    list1 W "truncateExtend"))
    (pcInst = dbCreatePath(pcCellView
    list(pcLayer pcPurpose)
    list2 W "truncateExtend"))
    )

    ;********************underpass and via on underpass***************************
    b=(R+W/2)/2.414
    c=(W+S)/2
    N1=fix(N/2)
    if( b-c>=5
    then
    NVx=fix(b-c-4)
    delx=b-c-4-NVx+0.64
    vx1=-b+1+delx
    vx2=c+3
    vx3=vx1
    vx4=vx2
    else
    NVx=fix(b-c-2)
    delx=b-c-2-NVx+0.64
    vx1=-b+delx/2
    vx2=c+2+delx/2
    vx3=vx1
    vx4=vx2
    )
    if(W<10
    then
    NVy=fix(W-1)
    dely=(W-1-NVy+0.64)/2
    wy=W
    else
    NVy=fix(8.8-1)
    dely=(8.8-1-NVy+0.64)/2
    wy=8.8
    )

    (pcLayer1 = "UTM")
    (pcLayer2 = "T4M1")
    (pcPurpose = "drawing")
    (pcMaster = dbOpenCellViewByType("ind8m" "ViaU" "layout" "maskLayout"))
    if( N/2==fix(N/2)
    then
    for(i 0 N1-1
    a1=R+W/2+(W+S)*2*i
    a2=R+W/2+(W+S)*2*i+1)
    a0=R+W/2+(W+S)*2*i-1)
    if( i==0
    then
    listu1=list(-c-3:-a1 c+3:-a1)
    listu2=list(-c-3:a1 -c:a1 c:a2 c+3:a2 )
    listu3=list(-b:a2 -c:a2 c:a1 b:a1)
    vy1=a2-wy/2+0.5+dely
    vy2=a1-wy/2+0.5+dely
    (pcInst = dbCreatePath(pcCellView
    list(pcLayer1 pcPurpose)
    listu1 W "truncateExtend"))
    (pcInst = dbCreatePath(pcCellView
    list(pcLayer1 pcPurpose)
    listu2 W "truncateExtend"))
    (pcInst = dbCreatePath(pcCellView
    list(pcLayer2 pcPurpose)
    listu3 wy "truncateExtend"))
    (array = dbCreateSimpleMosaic(pcCellView pcMaster "" (vx1:vy1) "R0" NVy NVx 1 1))
    (array = dbCreateSimpleMosaic(pcCellView pcMaster "" (vx2:vy2) "R0" NVy NVx 1 1))
    else
    listu1=list(-c-3:a1 -c:a1 c:a2 c+3:a2 )
    listu2=list(-b:a2 -c:a2 c:a1 b:a1)
    listu3=list(-c-3:-a0 -c:-a0 c:-a1 c+3:-a1)
    listu4=list(-b:-a1 -c:-a1 c:-a0 b:-a0)
    vy1=a2-wy/2+0.5+dely
    vy2=a1-wy/2+0.5+dely
    vy3=-a1-wy/2+0.5+dely
    vy4=-a0-wy/2+0.5+dely
    (pcInst = dbCreatePath(pcCellview
    list(pcLayer1 pcPurpose)
    listu1 W "truncateExtend"))
    (pcInst = dbCreatePath(pcCellview
    list(pcLayer2 pcPurpose)
    listu2 wy "truncateExtend"))
    (pcInst = dbCreatePath(pcCellview
    list(pcLayer1 pcPurpose)
    listu3 W "truncateExtend"))
    (pcInst = dbCreatePath(pcCellview
    list(pcLayer2 pcPurpose)
    listu4 wy "truncateExtend"))
    (array = dbCreateSimpleMosaic(pcCellView pcMaster "" (vx1:vy1) "R0" NVy NVx 1 1))
    (array = dbCreateSimpleMosaic(pcCellView pcMaster "" (vx2:vy2) "R0" NVy NVx 1 1))
    (array = dbCreateSimpleMosaic(pcCellView pcMaster "" (vx3:vy3) "R0" NVy NVx 1 1))
    (array = dbCreateSimpleMosaic(pcCellView pcMaster "" (vx4:vy4) "R0" NVy NVx 1 1))
    );end if
    );end for
    else
    for(i 0 N1
    a1=R+W/2+(W+S)*(2*i-1)
    a2=R+W/2+(W+S)*(2*i)
    a0=R+W/2+(W+S)*(2*i-2)
    if( i==0
    then
    listu1=list(-c-3:a1 c+3:a2 )
    (pcInst = dbCreatePath(pcCellView
    list(pcLayer1 pcPurpose)
    listu1 W "truncateExtend"))
    else
    listu1=list(-c-3:a1 -c:a1 c:a2 c+3:a2 )
    listu2=list(-b:a2 -c:a2 c:a1 b:a1)
    listu3=list(-c-3:-a0 -c:-a0 c:-a1 c+3:-a1)
    listu4=list(-b:-a1 -c:-a1 c:-a0 b:-a0)
    vy1=a2-wy/2+0.5+dely
    vy2=a1-wy/2+0.5+dely
    vy3=-a1-wy/2+0.5+dely
    vy4=-a0-wy/2+0.5+dely
    (pcInst = dbCreatePath(pcCellView
    list(pcLayer1 pcPurpose)
    listu1 W "truncateExtend"))
    (pcInst = dbCreatePath(pcCellview
    list(pcLayer2 pcPurpose)
    listu2 wy "truncateExtend"))
    (pcInst = dbCreatePath(pcCellview
    list(pcLayer1 pcPurpose)
    listu3 W "truncateExtend"))
    (pcInst = dbCreatePath(pcCellview
    list(pcLayer2 pcPurpose)
    listu4 wy "truncateExtend"))
    (array = dbCreateSimpleMosaic(pcCellView pcMaster "" (vx1:vy1) "R0" NVy NVx 1 1))
    (array = dbCreateSimpleMosaic(pcCellView pcMaster "" (vx2:vy2) "R0" NVy NVx 1 1))
    (array = dbCreateSimpleMosaic(pcCellView pcMaster "" (vx3:vy3) "R0" NVy NVx 1 1))
    (array = dbCreateSimpleMosaic(pcCellView pcMaster "" (vx4:vy4) "R0" NVy NVx 1 1))
    ); end if
    );end for
    );end if

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 5 years ago in reply to youcanred

    Something is pretty wrong with the code - whilst the parentheses are balanced, they don't match properly - for example, the let() ends at line 142 out of 181, there's an "else" on line 143 which isn't part of an if, and and the comments in the close parentheses suggest something is awry (the last line is ; end if, but it closes the pcDefinePCell). The comment on line 142 (again) suggests that it's ending a "for" but there's no for.

    I reformatted the code to try to make it more understandable, and commented out the line 142 and 143 (the lines I mentioned before) and added another close parenthesis at the end (to close the pcDefinePCell) - this puts everything within the let too. However, now it fails because the if( i==0 on line 98 in your code is referencing the variable i which is a loop variable elsewhere in the code, and this reference is outside the for loop.

    So I have no idea what you're expecting this code to do, but it can't work. I've not been able to guess what the real intent was, even after reformatting it to indent it properly so I stood a chance of understanding it. I also don't know why it is causing the error you mention - or maybe that error is unrelated to this PCell (there's no tech functions anywhere in the PCell code). The code as it stands won't generate a PCell super master because it's so broken.

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • youcanred
    youcanred over 5 years ago in reply to Andrew Beckett

    thank you Andrew. that's solved the problem! But sorry i made a mistake. this is not the code i want to ask, I paste the wrong code. what i want to ask is the code below: when i load the code in CIW, it returns true. but only a error marker when i call the pcell, can't see the octangle. I have no idea about it. Hope you can help me! thank you so much!

    pcDefinePCell(
    list(ddGetObj("RFlib") "xfmr_test" "layout"),
    (
    (di float 3.0e+01)
    (w float 5.0e+00)
    (gap1 float 5.0e+00)
    (layerNum int 6)
    )
    procedure(pcGenCell(pcCellView "d")
    prog((layerNum di w gap1 gap2)
    if(!pcCellView
    return()
    )
    (layerNum = ((pcCellView~>parameters)~>layerNum))
    if(!layerNum then
    (layerNum = 7)
    )
    if(!fixp(layerNum) then
    (layerNum = 7)
    )
    (di = ((pcCellView~>parameters)~>di))
    if(!di then
    (di = 30)
    )
    if(!floatp(di) then
    (di = 30)
    )
    (w = ((pcCellView~>parameters)~>w))
    if(!w then
    (w = 5.0)
    )
    if(!floatp(w) then
    (w = 5.0)
    )
    (gap1 = ((pcCellView~>parameters)~>gap1))
    if(gap1 then
    (gap1 = 5.0)
    )
    if(!floatp(gap1) then
    (gap1 = 5.0)
    )
    (gap2 = ((pcCellView~>parameters)~>gap2))
    if(!gap2 then
    (gap2 = 5.0)
    )
    if(!floatp(gap2) then
    (gap2 = 5.0)
    )
    let((grid ri ro hgap1 hgap2
    h1 h2 pi points1 points2
    )
    (grid = 0.005)
    (pi = 3.141593)
    (ri = (grid * round((di / (2 * grid)))))
    (ro = (grid * round(((ri + w) / grid))))
    (h1 = (grid * round(((ri * tan((pi / 8))) / grid))))
    (h2 = (grid * round((((ri + w) * tan((pi / 8))) / grid))))
    (hgap1 = (grid * round((gap1 / (2 * grid)))))
    (hgap2 = (grid * round((gap2 / (2 * grid)))))
    (points1 = tconc(nil
    list((- hgap1)
    (- ro)
    )
    ))
    tconc(points1
    list((- h2)
    (- ro)
    )
    )
    tconc(points1
    list((- ro)
    (- h2)
    )
    )
    tconc(points1
    list((- ro) h2)
    )
    tconc(points1
    list((- h2) ro)
    )
    tconc(points1
    list((- hgap2) ro)
    )
    tconc(points1
    list((- hgap2) ri)
    )
    tconc(points1
    list((- h1) ri)
    )
    tconc(points1
    list((- ri) h1)
    )
    tconc(points1
    list((- ri)
    (- h1)
    )
    )
    tconc(points1
    list((- h1)
    (- ri)
    )
    )
    tconc(points1
    list((- hgap1)
    (- ri)
    )
    )
    (points1 = car(points1))
    (points2 = tconc(nil
    list(hgap1
    (- ro)
    )
    ))
    tconc(points2
    list(h2
    (- ro)
    )
    )
    tconc(points2
    list(ro
    (- h2)
    )
    )
    tconc(points2
    list(ro h2)
    )
    tconc(points2
    list(h2 ro)
    )
    tconc(points2
    list(hgap2 ro)
    )
    tconc(points2
    list(hgap2 ri)
    )
    tconc(points2
    list(h1 ri)
    )
    tconc(points2
    list(ri h1)
    )
    tconc(points2
    list(ri
    (- h1)
    )
    )
    tconc(points2
    list(h1
    (- ri)
    )
    )
    tconc(points2
    list(hgap1
    (- ri)
    )
    )
    (points2 = car(points2))
    (layerNumstr = sprintf(layerNum "%d" layerNum))
    (lay = list(strcat("M" layerNumstr) "drawing"))
    rodCreatePolygon(?name "octh0" ?layer layer ?pts
    points1
    )
    rodCreatePolygon(?name "octh1" ?layer layer ?pts
    points2
    )
    rodAlign(?alignObj
    rodGetObj("octh0") ?alignHandle "centerLeft" ?refPoint
    list((- ro) ro)
    )
    rodAlign(?alignObj
    rodGetObj("octh1") ?alignHandle "centerRight" ?refPoint
    list(ro ro)
    )
    )
    return(t)
    )
    )

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 5 years ago in reply to youcanred

    There are a few mistakes in the code (see the comments with "ANDREW"). I corrected them with the original format here:

    pcDefinePCell(
    list(ddGetObj("RFlib") "xfmr_test" "layout"),
    (
    (di float 3.0e+01)
    (w float 5.0e+00)
    (gap1 float 5.0e+00)
    ; ANDREW - gap2 was missing as a PCell parameter
    (gap2 float 5.0e+00)
    (layerNum int 7)
    )
    ; ANDREW - commented out this block because 
    ; it makes no sense within pcDefinePCell
    /*
    procedure(pcGenCell(pcCellView "d")
    prog((layerNum di w gap1 gap2)
    if(!pcCellView
    return()
    )
    (layerNum = ((pcCellView~>parameters)~>layerNum))
    if(!layerNum then
    (layerNum = 7)
    )
    if(!fixp(layerNum) then
    (layerNum = 7)
    )
    (di = ((pcCellView~>parameters)~>di))
    if(!di then
    (di = 30)
    )
    if(!floatp(di) then
    (di = 30)
    )
    (w = ((pcCellView~>parameters)~>w))
    if(!w then
    (w = 5.0)
    )
    if(!floatp(w) then
    (w = 5.0)
    )
    (gap1 = ((pcCellView~>parameters)~>gap1))
    if(gap1 then
    (gap1 = 5.0)
    )
    if(!floatp(gap1) then
    (gap1 = 5.0)
    )
    (gap2 = ((pcCellView~>parameters)~>gap2))
    if(!gap2 then
    (gap2 = 5.0)
    )
    if(!floatp(gap2) then
    (gap2 = 5.0)
    )
    */
    let((grid ri ro hgap1 hgap2
    h1 h2 pi points1 points2
    )
    (grid = 0.005)
    (pi = 3.141593)
    (ri = (grid * round((di / (2 * grid)))))
    (ro = (grid * round(((ri + w) / grid))))
    (h1 = (grid * round(((ri * tan((pi / 8))) / grid))))
    (h2 = (grid * round((((ri + w) * tan((pi / 8))) / grid))))
    (hgap1 = (grid * round((gap1 / (2 * grid)))))
    (hgap2 = (grid * round((gap2 / (2 * grid)))))
    (points1 = tconc(nil
    list((- hgap1)
    (- ro)
    )
    ))
    tconc(points1
    list((- h2)
    (- ro)
    )
    )
    tconc(points1
    list((- ro)
    (- h2)
    )
    )
    tconc(points1
    list((- ro) h2)
    )
    tconc(points1
    list((- h2) ro)
    )
    tconc(points1
    list((- hgap2) ro)
    )
    tconc(points1
    list((- hgap2) ri)
    )
    tconc(points1
    list((- h1) ri)
    )
    tconc(points1
    list((- ri) h1)
    )
    tconc(points1
    list((- ri)
    (- h1)
    )
    )
    tconc(points1
    list((- h1)
    (- ri)
    )
    )
    tconc(points1
    list((- hgap1)
    (- ri)
    )
    )
    (points1 = car(points1))
    (points2 = tconc(nil
    list(hgap1
    (- ro)
    )
    ))
    tconc(points2
    list(h2
    (- ro)
    )
    )
    tconc(points2
    list(ro
    (- h2)
    )
    )
    tconc(points2
    list(ro h2)
    )
    tconc(points2
    list(h2 ro)
    )
    tconc(points2
    list(hgap2 ro)
    )
    tconc(points2
    list(hgap2 ri)
    )
    tconc(points2
    list(h1 ri)
    )
    tconc(points2
    list(ri h1)
    )
    tconc(points2
    list(ri
    (- h1)
    )
    )
    tconc(points2
    list(h1
    (- ri)
    )
    )
    tconc(points2
    list(hgap1
    (- ri)
    )
    )
    (points2 = car(points2))
    (layerNumstr = sprintf(layerNum "%d" layerNum))
    ; ANDREW - the variable in the next line was called "lay"
    ; not layer, and so the rodCreatePolygon failed
    (layer = list(strcat("M" layerNumstr) "drawing"))
    rodCreatePolygon(?name "octh0" ?layer layer ?pts
    points1
    )
    rodCreatePolygon(?name "octh1" ?layer layer ?pts
    points2
    )
    rodAlign(?alignObj
    rodGetObj("octh0") ?alignHandle "centerLeft" ?refPoint
    list((- ro) ro)
    )
    rodAlign(?alignObj
    rodGetObj("octh1") ?alignHandle "centerRight" ?refPoint
    list(ro ro)
    )
    )
    return(t)
    )
    ; ANDREW - with the commented out block at the top
    ; around pcGenCell, there was one two many parentheses
    ;)

    Then I reformatted it to make it easier to read:

    Both of these seem to work for me (I had to change the lib name and how the layer name was computed, but broadly it was the same)

    pcDefinePCell(list(ddGetObj("RFlib") "xfmr_test" "layout")
       ((di float 30.0)
        (w float 5.0)
        (gap1 float 5.0)
        ; ANDREW - gap2 was missing as a PCell parameter
        (gap2 float 5.0)
        (layerNum int 7)
       )
      ; ANDREW - commented out this block because 
      ; it makes no sense within pcDefinePCell
      /*
    procedure(pcGenCell(pcCellView "d")
    prog((layerNum di w gap1 gap2)
    if(!pcCellView
    return()
    )
    (layerNum = ((pcCellView~>parameters)~>layerNum))
    if(!layerNum then
    (layerNum = 7)
    )
    if(!fixp(layerNum) then
    (layerNum = 7)
    )
    (di = ((pcCellView~>parameters)~>di))
    if(!di then
    (di = 30)
    )
    if(!floatp(di) then
    (di = 30)
    )
    (w = ((pcCellView~>parameters)~>w))
    if(!w then
    (w = 5.0)
    )
    if(!floatp(w) then
    (w = 5.0)
    )
    (gap1 = ((pcCellView~>parameters)~>gap1))
    if(gap1 then
    (gap1 = 5.0)
    )
    if(!floatp(gap1) then
    (gap1 = 5.0)
    )
    (gap2 = ((pcCellView~>parameters)~>gap2))
    if(!gap2 then
    (gap2 = 5.0)
    )
    if(!floatp(gap2) then
    (gap2 = 5.0)
    )
    */ 
      let((grid
           ri
           ro
           hgap1
           hgap2
           h1
           h2
           pi
           points1
           points2
          )
        grid = 0.005
        pi = 3.141593
        ri = grid * round(di / (2 * grid))
        ro = grid * round((ri + w) / grid)
        h1 = grid * round((ri * tan(pi / 8)) / grid)
        h2 = grid * round(((ri + w) * tan(pi / 8)) / grid)
        hgap1 = grid * round(gap1 / (2 * grid))
        hgap2 = grid * round(gap2 / (2 * grid))
        points1 = tconc(nil list(minus(hgap1) minus(ro)))
        tconc(points1 list(minus(h2) minus(ro)))
        tconc(points1 list(minus(ro) minus(h2)))
        tconc(points1 list(minus(ro) h2))
        tconc(points1 list(minus(h2) ro))
        tconc(points1 list(minus(hgap2) ro))
        tconc(points1 list(minus(hgap2) ri))
        tconc(points1 list(minus(h1) ri))
        tconc(points1 list(minus(ri) h1))
        tconc(points1 list(minus(ri) minus(h1)))
        tconc(points1 list(minus(h1) minus(ri)))
        tconc(points1 list(minus(hgap1) minus(ri)))
        points1 = car(points1)
        points2 = tconc(nil list(hgap1 minus(ro)))
        tconc(points2 list(h2 minus(ro)))
        tconc(points2 list(ro minus(h2)))
        tconc(points2 list(ro h2))
        tconc(points2 list(h2 ro))
        tconc(points2 list(hgap2 ro))
        tconc(points2 list(hgap2 ri))
        tconc(points2 list(h1 ri))
        tconc(points2 list(ri h1))
        tconc(points2 list(ri minus(h1)))
        tconc(points2 list(h1 minus(ri)))
        tconc(points2 list(hgap1 minus(ri)))
        points2 = car(points2)
        layerNumstr = sprintf(layerNum "%d" layerNum)
        ; ANDREW - the variable in the next line was called "lay"
        ; not layer, and so the rodCreatePolygon failed
        layer = list(strcat("M" layerNumstr) "drawing")
        rodCreatePolygon(?name "octh0" ?layer layer ?pts points1)
        rodCreatePolygon(?name "octh1" ?layer layer ?pts points2)
        rodAlign(?alignObj rodGetObj("octh0") ?alignHandle "centerLeft" ?refPoint list(minus(ro) ro))
        rodAlign(?alignObj rodGetObj("octh1") ?alignHandle "centerRight" ?refPoint list(ro ro))
       )
      return(t)
     )
    ; ANDREW - with the commented out block at the top
    ; around pcGenCell, there was one two many parentheses
    ;)

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • youcanred
    youcanred over 5 years ago in reply to Andrew Beckett

    thank you! it works well.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information