• 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 20414
  • 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
Parents
  • techrddyz
    techrddyz over 8 years ago

    Hi Andrew,

    please find below my code. Based on what SkillUser said above, to turn on/off layers i just need to create  PCell parameters that match cdf parameters. i guess thats what you mean by 'the code that does the conditional part'. I can turn on/off metal layers  but cannot turn on/off vias. You can copy the code below and run it. Thanks alot for you help.

    ;; 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
    when(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
    ); when
          );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)))
    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
      ); 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
Reply
  • techrddyz
    techrddyz over 8 years ago

    Hi Andrew,

    please find below my code. Based on what SkillUser said above, to turn on/off layers i just need to create  PCell parameters that match cdf parameters. i guess thats what you mean by 'the code that does the conditional part'. I can turn on/off metal layers  but cannot turn on/off vias. You can copy the code below and run it. Thanks alot for you help.

    ;; 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
    when(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
    ); when
          );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)))
    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
      ); 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
Children
No Data

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