• 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. Create mulitpart path with 2 row of contacts

Stats

  • Locked Locked
  • Replies 5
  • Subscribers 143
  • Views 16829
  • 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

Create mulitpart path with 2 row of contacts

kbhow
kbhow over 15 years ago

Hi All,

Can we create a multipart path with 2 rows of contact? I was trying to customise the multipart path for 2 row of contact but failed. If there is way, how to do that, and what are the setting i needs to change?

Very thanks.

Rgds,

How

  • Cancel
  • dmay
    dmay over 15 years ago

    You should be able to define two different sets of sub-rectangles with different offsets from the centerline of the path.

     Derek

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • skillUser
    skillUser over 15 years ago

     Hi How,

    I agree with Derek - the subpart for the rectangles will only create a single row/line so if you want two then create one on one side of the master path and another on the other side - effectively each will have the same values except the separation value will be +/- sep. If you are using the rodCreatePath() SKILL function, then in the ?subRect argument list there will be two subrectangle argument lists, one with ?sep with a positive value and the other with ?sep with a negative value.

    Hope it helps,

    Lawrence.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Prabhu The ICL
    Prabhu The ICL over 15 years ago

    Hi kbhow,  The following code was written for tsmcN65nm dfm purpose.

    You can change the values and they can be passed through some techfile skill functions.

    I tried to get the dfm values from the techfile but I am in vain.

    Anyways, this code may not be efficient but can be sufficient for you to bring an idea...

    procedure(points(bbox dl1 dr1 dt1 db1)
      let( (ll ur llx urx lly ury X Y my_list)
              ll =  lowerLeft( bbox )
              ur = upperRight( bbox )
              llx = xCoord(ll)
              urx = xCoord(ur)
              X = urx-llx
              lly = yCoord( ll )
              ury = yCoord( ur )
              Y = ury - lly
              my_list = list( llx+(X/2.0):-db1+lly urx+dr1:-db1+lly dr1+urx:ury+dt1 -dl1+llx:dt1+ury -dl1+llx:lly-db1 llx+(X/2.0):-db1+lly)
      );let
    );proc

    procedure( union( bBoxList )
    let( ( llxList llyList urxList uryList minllx minlly maxurx maxury )
      llxList = foreach( mapcar bBox bBoxList xCoord( lowerLeft( bBox )))
      llyList = foreach( mapcar bBox bBoxList yCoord( lowerLeft( bBox )))
      urxList = foreach( mapcar bBox bBoxList xCoord( upperRight( bBox )))
      uryList = foreach( mapcar bBox bBoxList yCoord( upperRight( bBox )))
          minllx = apply( 'min llxList )
          minlly = apply( 'min llyList )
          maxurx = apply( 'max urxList )
          maxury = apply( 'max uryList )
          list( minllx:minlly maxurx:maxury )
      ) ; let
    ) ; procedure


    procedure(my_gring_p(dl dr dt db flag val tap t_val)

      for(j 0 val-1
          if(j==0 then w=0.17 else w=0.17+(0.23*j))
      )
    if(myForm~>AllSides~>value==

    nil then
      if(tap=="NTAP" then
          dl1 = dl + 0.26 +w/2
          dr1 = dr + 0.26 +w/2
          dt1 = dt + 0.26 +w/2
          db1 = db + 0.26 +w/2
      else
          dl1 = dl + 0.03 +w/2
          dr1 = dr + 0.03 +w/2
          dt1 = dt + 0.03 +w/2
          db1 = db + 0.03 +w/2
      );if
    else
      if(tap=="NTAP" then
          dl1=dr1=dt1=db1= t_val + w/2 + 0.26
      else
          dl1=dr1=dt1=db1= t_val + w/2 + 0.03
      );if
    );if

      if(flag=="Multiple" then
          foreach(box geGetSelSet()
              draw_ring_p(points(box~>bBox dl1 dr1 dt1 db1) val tap)
          );for
      else
      if(geGetSelSetCount()>1 then
          draw_ring_p(points(union(geGetSelSet()~>bBox) dl1 dr1 dt1 db1) val tap)
      else
          draw_ring_p(points(car(geGetSelSet()~>bBox) dl1 dr1 dt1 db1) val tap)
      );if       );if
    );pro

    procedure(draw_ring_p(points num tap)
    b1='()
    choose = list( list( ?layer list("M1" "drawing") ?enclosure  0.0 ?choppable t ?beginOffset -0.0 ?endOffset -0.0 )
    list( ?layer list("PP" "drawing") ?enclosure -0.03 ?choppable t ?beginOffset 0.0 ?endOffset 0.0 )
    list( ?layer list("NP" "drawing") ?enclosure -0.03 ?choppable t ?beginOffset 0.0 ?endOffset 0.0 )
    list( ?layer list("NW" "drawing") ?enclosure -0.26 ?choppable t ?beginOffset 0.0 ?endOffset 0.0 ) );listend

      if(tap=="NTAP" then
          l1 = list( nth(0 choose) nth(2 choose) nth(3 choose) )
      else
          l1 = list( nth(0 choose) nth(1 choose) )
      );if

      for(i 0 num-1
          if(i==0 then sep=-0.13 W=0.17 else sep=-0.13-(0.23*i)  W=0.17+(0.23*i))
    b1 = cons(list( ?layer list("CO" "drawing") ?width 0.09 ?length    0.09 ?choppable    t ?sep sep ?justification "left" ?space    0.15 ?beginOffset -0.07 ?endOffset -0.07 ?beginSegOffset 0.0 ?endSegOffset 0.0 ?gap "distribute" ) b1)
      );for

    rodCreatePath(
          ?cvId     deGetEditCellView()
          ?layer     list("OD" "drawing")
          ?width     W
          ?choppable     t
          ?pts         points
          ?encSubPath l1
          ?subRect    b1
           );rect
    );proc

    procedure(createRingForm()
     let((guardType myForm  enclosedBy )
     guardType = hiCreateRadioField(
                        ?name 'guardType
                ?choices list( "Single" "Multiple")
                ?defValue "Single" ); hiCreateRadioField

     enclosedBy = hiCreateFloatField(
              ?name 'enclosedBy
              ?defValue 0.5
              ?enabled nil
              )

     enclosedBy_l = hiCreateFloatField(
              ?name 'enclosedBy_l
              ?prompt "Left ... "
              ?defValue 1.0
              ?enabled t
              )

     enclosedBy_r = hiCreateFloatField(
              ?name 'enclosedBy_r
              ?prompt "Right ... "
              ?defValue 1.0
              ?enabled t
              )

     enclosedBy_t = hiCreateFloatField(
              ?name 'enclosedBy_t
              ?prompt "Top ... "
              ?defValue 1.0
              ?enabled t
              )

     enclosedBy_b = hiCreateFloatField(
              ?name 'enclosedBy_b
              ?prompt "Bottom ... "
              ?defValue 1.0
              ?enabled t
              )

     num_co     = hiCreateIntField(
              ?name 'num_co
              ?prompt "No. of Contact Rows ... "
              ?defValue 1
              )

     TAP        = hiCreateRadioField(
                        ?name 'TAP
                ?choices list( "NTAP" "PTAP")
                ?defValue "NTAP" ); hiCreateRadioField

     AllSides        = hiCreateBooleanButton(
                        ?name 'AllSides
                ?buttonText "AllSides"               ?defValue nil
                ?callback "if(myForm->AllSides->value then myForm->enclosedBy_l->enabled=myForm->enclosedBy_r->enabled=myForm->enclosedBy_t->enabled=myForm->enclosedBy_b->enabled=nil myForm->enclosedBy->enabled=t else myForm->enclosedBy_l->enabled=myForm->enclosedBy_r->enabled=myForm->enclosedBy_t->enabled=myForm->enclosedBy_b->enabled=t myForm->enclosedBy->enabled=nil)"
                         ); hiCreateRadioField

     myForm= hiCreateAppForm(
              ?name 'myForm
              ?fields list(
                       list(enclosedBy_l 0:0 260:25 200 )
                       list(enclosedBy_r 300:0 260:25 200 )
                       list(enclosedBy_t 0:30 260:25 200 )
                       list(enclosedBy_b 300:30 260:25 200 )
                       list(num_co 0:60 260:25 200)
                       list(guardType 0:90 260:25 200 )
                       list(TAP 300:90 260:25 200)
                       list(AllSides 0:120 260:25 200)
                       list(enclosedBy 300:120 260:25 200)
                       )
              ?formTitle "A SoC Guard Ring form ..."
              ?callback "my_gring_p(enclosedBy_l~>value enclosedBy_r~>value enclosedBy_t~>value enclosedBy_b~>value guardType~>value num_co~>value TAP~>value enclosedBy~>value)"
              ?buttonLayout 'OKCancelApply
              ?initialSize t
              )
     hiDisplayForm(myForm)
      );let
    );proc

    createRingForm()

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ends here;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

     Best Regards...

    Prabhakar. K --- The ICL Engineer

    SoCtronics

     

     

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • kbhow
    kbhow over 15 years ago

    Hi All,

    Really thanks a lot for the advice and great helping hands. Let's me have a try and return back if there is any issue.

    Thanks

    Rgds,

    How

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 15 years ago

    One point to Prabhakar. It's really good practice to use a prefix (we recommend an uppercase prefix to avoid clashing with Cadence functions), in order to distinguish between various code. For example, if you and colleagues write various applications, there's quite a high chance of creating functions called things like points() or union(). If your functions were called SOCcreateGuardPoints() and SOCcreateGuardUnion(), there's much less chance of function clashes.

    Regards,

    Andrew.

    • 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