Home > Community > Forums > Custom IC SKILL > How to create a transistor pcell in SKILL?

Email

* Required Fields

Recipients email * (separate multiple addresses with commas)

Your name *

Your email *

Message *

Contact Us

* Required Fields
First Name *

Last Name *

Email *

Company / Institution *

Comments: *

 How to create a transistor pcell in SKILL? 

Last post Tue, Jul 29 2014 1:43 AM by Andrew Beckett. 7 replies.
Started by Elezebeth 11 Aug 2009 11:48 PM. Topic has 7 replies and 4541 views
Page 1 of 1 (8 items)
Sort Posts:
  • Tue, Aug 11 2009 11:48 PM

    • Elezebeth
    • Not Ranked
    • Joined on Mon, Apr 13 2009
    • Posts 1
    • Points 20
    How to create a transistor pcell in SKILL? Reply

    Hi,

    I am new to SKILL coding.I have not done any pcell coding in SKILL.I would like to know whether we can create mosfet pcells using SKILL code.The way I tried to do this is using rodCreateRect( ) to create different layers of the transistor say diffusion,poly,contacts etc.and allign all these layers using rodAlign( ).But the transistor that got created could not be deleted at a time....ie.the layout is flattened.If i select the rectangle that I have set as reference and try to delete the whole transistor layout doesn't get deleted, only that particular layer is deleted.

    The other way I found is to do using ?subRectArray.but the problem with that is, the number of contacts in a transistor will increase as the width of the transistor increase.So the number of sub-rectangles that have to be created is variable.How to do that?

    Can anybody please guide me on this?

    Thanks and Regards,

    Elezebeth 

     

     

    • Post Points: 20
  • Sat, Aug 15 2009 11:34 PM

    Re: How to create a transistor pcell in SKILL? Reply

    It sounds as if you're not actually creating a pcell, but just creating level-0 ROD objects.

    Here's a simple ROD-based example that might get you started:

    ;
    ; This pcell demonstrates the use of sub-rectangles and offset subpaths
    ; in the multipart path transistor implementation. The name of the master
    ; view is:
    ;
    ; pcells step8 layout
    ;
    ; This pcell accepts these parameters:
    ;
    ; width Width of the transistor's active area (note: this is a
    ; distance measured in the Y-direction).
    ; (float, default = 3.0)
    ;
    ; length Length of the transistor's active area (note: this is a
    ; distance measured in the X-direction).
    ; (float, default = 0.6)
    ;
    ; polyLayer Name of the poly layer.
    ; (string, default = "poly")
    ;
    ; diffLayer Name of the diffusion layer.
    ; (string, default = "pdiff")
    ;
    ; contLayer Name of the contact layer.
    ; (string, default = "cont")
    ;
    ; metalLayer Name of the metal layer.
    ; (string, default = "metal1")
    ;
    ; drainName Name of the drain connection.
    ; (string, default = "D")
    ;
    ; gateName Name of the gate connection.
    ; (string, default = "G")
    ;
    ; sourceName Name of the source connection.
    ; (string, default = "S")
    ;
    ; sourceContact Whether source contacts should be included
    ; (boolean, default = t)
    ;
    ; drainContact Whether drain contacts should be included
    ; (boolean, default = t)
    ;
    pcDefinePCell(
    ; Identify the target cellview.
    list(ddGetObj("pcells") "step8" "layout")

    ; Define formal parameter name-value pairs.
    (
    (width 3.0)
    (length 0.6)
    (polyLayer "poly")
    (diffLayer "pdiff")
    (contLayer "cont")
    (metalLayer "metal1")
    (drainName "D")
    (gateName "G")
    (sourceName "S")
    (sourceContact t)
    (drainContact t)
    )

    ; Define the contents of this cellview.
    let((tfId polyExtend contWidth polyContSep diffContEnclose
    metalContEnclose diffPolyEnclose pinEndOffset polySep transObj grid
    polyDiffSep sdWidth)

    ; convert to proper booleans
    sourceContact=(sourceContact==t || sourceContact=="TRUE")
    drainContact=(drainContact==t || drainContact=="TRUE")

    ; Get the technology information for this cell.
    tfId = techGetTechFile(ddGetObj("pcells"))

    ; Get the minimum extension of poly beyond diffusion.
    polyExtend = techGetSpacingRule(tfId "minExtension" polyLayer)

    ; Get the minimum contact width.
    contWidth = techGetSpacingRule(tfId "minWidth" contLayer)

    ; Get the gate spacing
    polySep = techGetSpacingRule(tfId "minSpacing" polyLayer)

    ; Get the minimum poly to contact spacing.
    polyContSep = techGetSpacingRule(tfId "minSpacing" polyLayer contLayer)

    ; Get the minimum poly to diffusion spacing.
    polyDiffSep = techGetSpacingRule(tfId "minSpacing" polyLayer diffLayer)

    ; Get the minimum diffusion enclosure of contact.
    diffContEnclose =
    techGetOrderedSpacingRule(tfId "minEnclosure" diffLayer contLayer)

    ; Get the minimum diffusion enclosure of poly (used when metal contacts
    ; not included)
    diffPolyEnclose =
    techGetOrderedSpacingRule(tfId "minEnclosure" diffLayer polyLayer)

    ; Get the minimum metal enclosure of contact.
    metalContEnclose =
    techGetOrderedSpacingRule(tfId "minEnclosure" metalLayer contLayer)

    ; pin end offset
    pinEndOffset = -(polyExtend + diffContEnclose - metalContEnclose)

    ; source/drain width
    sdWidth = contWidth+polyContSep+diffContEnclose

    ; Get the minimum resolution for this process.
    grid = techGetMfgGridResolution(tfId)

    ;------------------------------------------------------------------
    ; Create the gate and diffusion regions.
    ;------------------------------------------------------------------
    transObj = rodCreatePath(
    ?layer list(polyLayer "drawing")
    ?endType "variable"
    ?width length
    ?pts list(0.0:0.0 0.0:width)
    ?beginExt polyExtend
    ?endExt polyExtend
    ; Define the diffusion region - just under the gate
    ?encSubPath
    setof(arg
    list(
    list(
    ?layer list(diffLayer "drawing")
    ?enclosure 0.0
    ?beginOffset -polyExtend
    ?endOffset -polyExtend
    )
    )
    arg
    )
    ?offsetSubPath
    setof(arg
    list(
    ; Define the drain metal stripe.
    when(drainContact
    list(
    ?layer list(metalLayer "drawing")
    ?pin t
    ?termName drainName
    ?justification "left"
    ?width contWidth + 2.0*metalContEnclose
    ?sep polyContSep - metalContEnclose
    ?beginOffset pinEndOffset
    ?endOffset pinEndOffset
    )
    )
    ; Define the source metal stripe.
    when(sourceContact
    list(
    ?layer list(metalLayer "drawing")
    ?pin t
    ?termName sourceName
    ?justification "right"
    ?width contWidth + 2.0*metalContEnclose
    ?sep polyContSep - metalContEnclose
    ?beginOffset pinEndOffset
    ?endOffset pinEndOffset
    )
    )
    ; Define the diffusion source area
    list(
    ?layer list(diffLayer "drawing")
    ; width depends on whether source contact included or not
    ?width if(sourceContact sdWidth diffPolyEnclose)
    ?justification "right"
    ?beginOffset -polyExtend
    ?endOffset -polyExtend
    )
    ; Define the diffusion drain area
    list(
    ?layer list(diffLayer "drawing")
    ; width depends on whether drain contact included or not
    ?width if(drainContact sdWidth diffPolyEnclose)
    ?justification "left"
    ?beginOffset -polyExtend
    ?endOffset -polyExtend
    )
    ; Define the drain diffusion pin. For abut reasons the pin is
    ; the same height that the metal pin is
    ; NOTE - if the difference between diffPolyEnclose and polySep
    ; is greater than the minimum gate length, then when abutted
    ; the drain pin from one transistor can short out the
    ; other transistor. This could be dealt with if necessary by
    ; making the code a bit smarter
    list(
    ?layer list(diffLayer "pin")
    ?pin t
    ?termName drainName
    ?justification "left"
    ; width adjusts to ensure that the diffusion pins will touch
    ; when the devices abut
    ?width if(drainContact sdWidth diffPolyEnclose)
    ?beginOffset pinEndOffset
    ?endOffset pinEndOffset
    )
    ; Define the source diffusion pin. For abut reasons the pin is
    ; the same height that the metal pin is
    list(
    ?layer list(diffLayer "pin")
    ?pin t
    ?termName sourceName
    ?justification "right"
    ?width if(sourceContact sdWidth diffPolyEnclose)
    ?beginOffset pinEndOffset
    ?endOffset pinEndOffset
    )
    )
    arg
    )
    ?subRect
    setof(arg
    list(
    ; Define the drain contact array.
    when(drainContact
    list(
    ?layer list(contLayer "drawing")
    ?justification "left"
    ?sep polyContSep
    ?beginOffset -(polyExtend + diffContEnclose)
    ?endOffset -(polyExtend + diffContEnclose)
    )
    )
    ; Define the source contact array.
    when(sourceContact
    list(
    ?layer list(contLayer "drawing")
    ?justification "right"
    ?sep polyContSep
    ?beginOffset -(polyExtend + diffContEnclose)
    ?endOffset -(polyExtend + diffContEnclose)
    )
    )
    ; Define the gate pins.
    list(
    ?layer list(polyLayer "pin")
    ?pin t
    ?termName gateName
    ?width length
    ?length grid
    ?space width - 2*grid
    )
    )
    arg
    )
    )
    rodCreateRect(
    ?layer contLayer
    ?width 2.0
    ?length 3.0
    )
    ; rodUnNameShape(transObj)

    ;------------------------------------------------------------------
    ; Dimensions for auto-abutment
    ; This is fairly simplistic, and in the case of different sized
    ; devices it can end up with the spacing between gates not quite
    ; as tight as possible in some cases. However, it demonstrates
    ; the principle.
    ; These dimensions are used in the abut function
    ;------------------------------------------------------------------
    pcCellView~>sameWidthDist=-diffPolyEnclose
    pcCellView~>diffWidthDist=polyDiffSep-diffPolyEnclose

    ;------------------------------------------------------------------
    ; Prevent overlap markers
    ;------------------------------------------------------------------
    pcCellView~>lxBlockOverlapCheck=t

    ;------------------------------------------------------------------
    ; Add auto-abutment properties
    ;------------------------------------------------------------------
    foreach(pin dbFindTermByName(pcCellView "S")~>pins
    pin~>fig~>abutFunction="abAbutFunction"
    pin~>fig~>abutAccessDir='("right")
    )
    foreach(pin dbFindTermByName(pcCellView "D")~>pins
    pin~>fig~>abutFunction="abAbutFunction"
    pin~>fig~>abutAccessDir='("left")
    )

    )
    )

    Regards,

    Andrew.

    • Post Points: 20
  • Tue, Apr 2 2013 8:02 AM

    • SkVlsi
    • Not Ranked
    • Joined on Fri, Sep 14 2012
    • Posts 8
    • Points 145
    Re: How to create a transistor pcell in SKILL? Reply
    Hi Andrew, I tried this transistor pcell code. its working perfectly after some minor modification related to layer type, however i can see this error in CIW when i load this code. Any idea what kind of error it is ? i tried this code in IC6.1.5 *WARNING* (DB-270534): trigger function: tscSchCheckDbcv is not defined. Regards, Shashikumar Gautam
    • Post Points: 20
  • Fri, Apr 5 2013 11:05 PM

    Re: How to create a transistor pcell in SKILL? Reply

    This is something in your environment - somebody has called either dbRegPostSaveTrigger or dbRegSaveTrigger (there's a couple of other triggers it might be) and then not defined the function. The function tscSchCheckDbcv is not one of ours - my guess is that the "tsc" might give you a clue - perhaps it is related to a design kit that you're using?

    It's probably harmless, and if you do:

    dbUnregSaveTrigger('tscSchCheckDbcv)
    dbUnregPostSaveTrigger('tscSchCheckDbcv)

    (since I don't know what kind of trigger it is), that should remove the trigger and hence remove the warning.

    Regards,

    Andrew.

    • Post Points: 20
  • Mon, Apr 8 2013 8:22 PM

    • SkVlsi
    • Not Ranked
    • Joined on Fri, Sep 14 2012
    • Posts 8
    • Points 145
    Re: How to create a transistor pcell in SKILL? Reply
    Hi Andrew, Thankyou. I did work and there is nor warning now. However may i know what are these trigger? Actually i was using a gpdk45 for creating this pcell. Regards, shashikumar
    • Post Points: 20
  • Tue, Apr 9 2013 12:28 AM

    Re: How to create a transistor pcell in SKILL? Reply

    They allow you to register a SKILL function to be called when a cellView is saved - one trigger is called before the save and one after the save. 

    People use these to implement checks or store additional data at save time.

    Regards,

    Andrew 

    • Post Points: 20
  • Tue, Jun 24 2014 3:52 AM

    • vinayak12
    • Not Ranked
    • Joined on Tue, Jun 24 2014
    • Posts 2
    • Points 40
    Re: How to create a transistor pcell in SKILL? Reply

    Hi Andrew,

    How to create pulldown menu in the parameter category?

     

    Thanks,

    Vinayak M.

    • Post Points: 20
  • Tue, Jul 29 2014 1:43 AM

    Re: How to create a transistor pcell in SKILL? Reply

    Create CDF for the cell, and define the particular paramater as a "cyclic" type (Tools->CDF->Edit CDF, making sure you set the CDF type to "Base" so that it gets stored).

    Andrew.

    • Post Points: 5
Page 1 of 1 (8 items)
Sort Posts:
Started by Elezebeth at 11 Aug 2009 11:48 PM. Topic has 7 replies.