• 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. how to write a SKILL code for PCELL powergrid

Stats

  • Locked Locked
  • Replies 14
  • Subscribers 142
  • Views 20402
  • 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

how to write a SKILL code for PCELL powergrid

techrddyz
techrddyz over 8 years ago

Hi all,

I am new to SKILL coding. I am trying to create a power grid PCELL using SKILL. The user can switch on and off layers/vias depending on needs. I found some SKILL code online and modified to meet my need. Now, i can create metals (ex. M3) but I dont know how i can turn it on and off when the user checks on/off the checkbox on the 'Edit Instance Properties' window. please see my code below. 

procedure(powerGridPcell(cv "dnn")
let( (rectRodObj)

Nx=7
temp = 1
for(i 0 Nx
temp = 0.63 * i
rectRodObj = rodCreateRect(
?cvId cv
?layer list("M3" "drawing")
?bBox list(0:temp+0.125 5.04:temp+0.505)
)
);End for i

); let
); procedure


;; Create the PCell, the "drawing routine" is encapsulated in the
;; powerGridPcell function which does all the work

pcDefinePCell(
list(ddGetObj("test_rudy") "power_grid_pcell" "layout")
(
)
let( ((cv pcCellView))
powerGridPcell(cv)
); let
)

;; Create the CDF for the 'l' and 'w' parameters
let( (cellId cdfId)
when(cellId = ddGetObj("test_rudy" "power_grid_pcell")
;; if the cell CDF already exists, delete it
when( cdfId = cdfGetBaseCellCDF(cellId)
cdfDeleteCDF(cdfId)
)
;; create the base cell CDF
cdfId = cdfCreateBaseCellCDF(cellId)
;; create the parameters
cdfCreateParam( cdfId
?name "visibilityM3"
?prompt "M3"
?defValue "true"
?type "boolean"
?display "t"
)

cdfSaveCDF(cdfId)
); when
); let

Thanks

  • Cancel
  • techrddyz
    techrddyz over 8 years ago

    Hi Lawrence,

    sorry about that. please find below my code with the 'when' condition added around the powerGridPcell_via() function

    ;; Create the PCell, the "drawing routine" is encapsulated in the
    ;; powerGridPcell function which does all the work
    pg_layer_list = list(
    list("M1")
    list("M2" "V1")
    )
    coordIndex = 1
    ;;create metal layers
    procedure(powerGridPcell_metal(cv drawMetal rowCol metalLayer)
      let( (rectRodObj)
          for(i 0 rowCol
    if(drawMetal == t
     case(metalLayer
        ("M1"
        coordIndex = 0.63 * i
        rectRodObj = rodCreateRect(
    ?cvId    cv
    ?layer   list(metalLayer "drawing")
    ?bBox    list(0:coordIndex+0.125 5.04:coordIndex+0.505)
        )
        )
    ("M2"
        coordIndex = 0.63 * i
        rectRodObj = rodCreateRect(
    ?cvId    cv
    ?layer   list(metalLayer "drawing")
    ?bBox    list(coordIndex+0.125:0 coordIndex+0.505:5.04)
        )
        )
      );case
    ); if
          );End for i
      ); let
    ); procedure
    ;create vias
    procedure(powerGridPcell_via(cv v_layer row col v_xStart1 v_yStart1 v_xStart2 v_yStart2 v_xPitch v_yPitch v_w v_l v_row v_col rowPitch colPitch)
       for(i 0 row ;row
          for(j 0 col ;col
    if(mod(j 2) == 0 && mod(i 2) == 0 then
    tempx1 = colPitch * (j/2) + v_xStart1
    tempy1 = rowPitch * (i/2) + v_yStart1
    dbCreateViaShapeArray(cv v_layer nil tempx1 tempy1 v_xPitch v_yPitch v_w v_l v_row v_col)
    else
    tempx1 = colPitch * (j/2) + v_xStart2
    tempy1 = rowPitch * (i/2) + v_yStart2
    dbCreateViaShapeArray(cv v_layer nil tempx1 tempy1 v_xPitch v_yPitch v_w v_l v_row v_col)
    );if
          );for
       );for
    )
    pcDefinePCell(
      list(ddGetObj("test_rudy") "power_grid_pcell_test" "layout")
      (
    (M1 t)
    (V1 t)
    (M2 t)
      )
      let( ((cv pcCellView))  
    powerGridPcell_metal(cv M1 7 nth(0 nth(0 pg_layer_list)))
    powerGridPcell_metal(cv M2 7 nth(0 nth(1 pg_layer_list)))
         when(V1
    powerGridPcell_via(cv nth(1 nth(1 pg_layer_list)) 7 7 0.195 0.195 0.825 0.825 0.16 0.16 0.08 0.08 2 2 1.26 1.26)       ;V1
         );when
      ); let
    )
    ;; Create the CDF 
    let( (cellId cdfId)
      when(cellId = ddGetObj("test_rudy" "power_grid_pcell_test")
        ;; if the cell CDF already exists, delete it
        when( cdfId = cdfGetBaseCellCDF(cellId)
          cdfDeleteCDF(cdfId)
        )
        ;; create the base cell CDF
        cdfId = cdfCreateBaseCellCDF(cellId)
        ;; create the parameters
        cdfCreateParam( cdfId
          ?name    "M1"
          ?prompt  "M1"
          ?defValue    "true"
          ?type    "boolean"
          ?display    "t"
        )
        cdfCreateParam( cdfId
          ?name    "V1"
          ?prompt  "V1"
          ?defValue    "true"
          ?type    "boolean"
          ?display    "t"
        )
        cdfCreateParam( cdfId
          ?name    "M2"
          ?prompt  "M2"
          ?defValue    "true"
          ?type    "boolean"
          ?display    "t"
        )
        
        cdfSaveCDF(cdfId)
      ); when
    ); let
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 8 years ago

    Rudy,

    For various strange historical reasons, you should assume that boolean parameter values are either t/"TRUE" or nil/"FALSE". What's happening in this case is that V1 ends up being "FALSE" when you turn it off and since you're just using when(V1...   it's still executing the branch (because "FALSE" is non-nil and hence is true). So best to be complete:

    when(V1==t || V1=="TRUE"
    ...
    )

    If you do that, it works fine. I'd do the same for your M1/M2 switches too elsewhere in the code.

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • techrddyz
    techrddyz over 8 years ago
    Thanks Andrew and Lawrence. adding V1==t || V1=="TRUE" works great.

    Rudy
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Sue21
    Sue21 over 5 years ago in reply to techrddyz

    Hi, can anyone please help me with achieving the same pwrgrid pcell using the graphical method of creating a pcell. I want to be able to turn ON and turn OFF specific metal layers and vias. I was able to create the parameter boxes that can be checked/unchecked( in the instance property form). From the Pcell plugin, I dropped down to parameterized layers--> Define. And then I set them to be boolean using Parameters-> Edit.

    But checking or unchecking the boxes has no effect on the visibility. I know I need to define something more, but don't know what and how to.

    Can you please help me? I appreciate any help on this.

    • 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