Sample Parameterized Cells Set Up for Abutment
Example 1
This example shows what each of the different parts does:
----------------------------------------------------------------------
; Function: abutFunction(iA iB pA pB pASide connection event
; @optional (group nil))
;
; Inputs: group - the abutment group that these two cells belong to.
; ______________________________________________________________________
;
; iA = Instance Id of cell that will move during abutment
; ______________________________________________________________________
;
; iB = Instance Id of cell being abutted to
; ______________________________________________________________________
;
; pA = Overlapping Pin Fig of iA
; ______________________________________________________________________
;
; pB = Overlapping Pin Fig of iB
; ______________________________________________________________________
;
; pASide = Abutting pin access direction
; ______________________________________________________________________
;
connection = an integer value of 1 or 2 that indicates:
;
; 1. pins are connected to the same net and do not
; connect to any other pin.
;
; 2. pins are connected to the same net and the net
; connects to other pins
; ______________________________________________________________________
;
; event = integer that represents abutment event:
;
; 1. compute abutment offset
; 2. Pcell parameter adjustment for abutment
; 3. Pcell parameter adjustment for unabutment
; ______________________________________________________________________
;
; group = abutment group pointer available to specific events:
; abutment group pointer available to Events 1, 2, and 3
; ______________________________________________________________________
; ; Outputs: depends ; ; Side effects: ; procedure( abutFunction(iA iB pA pB pASide connection event @optional (group nil)) prog((result) case(event (1 ; Compute offset result = getAbutmentOffset(iA iB pA pB pASide connection) ) (2 ; Adjust Pcell parameters result = setAbutmentParams(iA iB pA pB pASide connection group) ) (3 ; Adjust Pcell parameters back to default resetAbutmentParams(group iA iB) result = t ) (t ; Anything else return a nil
result = nil
)
)
return(result)
)
)
Example 2
This example shows how to add abutment properties to pins in an inverter Pcell.
; *** the following 4 pins are on metal1 and are on ***
; *** the power and ground rails. This will allow ***
; *** abutment to other standard cells ***
obj = leftVddPin~>dbId
dbReplaceProp(obj "abutAccessDir" "list" list("left"))
dbReplaceProp(obj "abutClass" "string" "stdcell")
dbReplaceProp(obj "abutFunction" "string" "stdCellFunc")
; *** the following property is a technique for passing ***
; *** information to the user defined function. In this ***
; *** case the minimum cell height is dependent on many ***
; *** factors including design rules and is originally ***
; *** calculated in the Pcell code. This avoids ***
; *** duplicating calculations in the user-defined ***
; *** function ***
dbReplaceProp(obj "minCellHeight" "float" minH)
obj = rightVddPin~>dbId
dbReplaceProp(obj "abutAccessDir" "list" list("right"))
dbReplaceProp(obj "abutClass" "string" "stdcell")
dbReplaceProp(obj "abutFunction" "string" "stdCellFunc")
dbReplaceProp(obj "minCellHeight" "float" minH)
obj = leftGndPin~>dbId
dbReplaceProp(obj "abutAccessDir" "list" list("left"))
dbReplaceProp(obj "abutClass" "string" "stdcell")
dbReplaceProp(obj "abutFunction" "string" "stdCellFunc")
dbReplaceProp(obj "minCellHeight" "float" minH)
obj = rightGndPin~>dbId
dbReplaceProp(obj "abutAccessDir" "list" list("right"))
dbReplaceProp(obj "abutClass" "string" "stdcell")
dbReplaceProp(obj "abutFunction" "string" "stdCellFunc")
dbReplaceProp(obj "minCellHeight" "float" minH)
; *** The following 4 pins are the diffusion pins ***
; *** of the individual MOS devices in the inverter ***
; *** this will allow abutment of other individual ***
; *** MOS devices to the inverter ***
obj = POutPin~>dbId
dbReplaceProp(obj "abutAccessDir" "list" list("right"))
dbReplaceProp(obj "abutClass" "string" "ptran")
dbReplaceProp(obj "abutFunction" "string" "mosAbutFunc")
dbReplaceProp(obj "contactParam" "string" "POutCnts")
dbReplaceProp(obj "w" "float" pw)
; *** the automatic spacing properties are used if abutment fails ***
dbReplaceProp(obj "vxlInstSpacingDir" "list" list("right"))
dbReplaceProp(obj "vxlInstSpacingRule" "float" .35 )
obj = NOutPin~>dbId
dbReplaceProp(obj "abutAccessDir" "list" list("right"))
dbReplaceProp(obj "abutClass" "string" "ntran")
dbReplaceProp(obj "abutFunction" "string" "mosAbutFunc")
dbReplaceProp(obj "contactParam" "string" "NOutCnts")
dbReplaceProp(obj "w" "float" nw)
dbReplaceProp(obj "vxlInstSpacingDir" "list" list("right"))
dbReplaceProp(obj "vxlInstSpacingRule" "float" .35 )
obj = PPwrPin~>dbId
dbReplaceProp(obj "abutAccessDir" "list" list("left"))
dbReplaceProp(obj "abutClass" "string" "ptran")
dbReplaceProp(obj "abutFunction" "string" "mosAbutFunc")
dbReplaceProp(obj "contactParam" "string" "PPwrCnts")
dbReplaceProp(obj "w" "float" pw)
dbReplaceProp(obj "vxlInstSpacingDir" "list" list("left"))
dbReplaceProp(obj "vxlInstSpacingRule" "float" .35 )
obj = NPwrPin~>dbId
dbReplaceProp(obj "abutAccessDir" "list" list("left"))
dbReplaceProp(obj "abutClass" "string" "ntran")
dbReplaceProp(obj "abutFunction" "string" "mosAbutFunc")
dbReplaceProp(obj "contactParam" "string" "NPwrCnts")
dbReplaceProp(obj "w" "float" nw)
dbReplaceProp(obj "vxlInstSpacingDir" "list" list("left"))
dbReplaceProp(obj "vxlInstSpacingRule" "float" .35 )
-
Calls to dbReplaceProp for Abutment Groups: When using the function
dbReplaceProp, you must calldbReplacePropfor abutment groups before calls todbReplacePropfor Pcell properties because the IDs of the objects before and after abutment occurs cannot be guaranteed to be the same. This is because the instance master is purged as soon as the instance reference count associated with the instance master becomes zero. Therefore you cannot rely on the same data or IDs after Pcell re-evaluation. -
Pin Figure Names must be Unique within a Terminal: When developing transistor Pcells, wherever there is more than one figure attached to any
oaPin(as is the case when two figures are strongly connected), each figure attached to the pin must have a name that is unique within the same terminal and its corresponding must-connect terminals. If this is not the case, use thedbSetPinFigNameSKILL function to assign a unique name to each figure attached to the pin. - Abutting Pcell Supermasters from Legacy Designs: If a Pcell supermaster that is instantiated in a legacy design has changed, possibly due to a PDK update since the design was last opened in a newer version of Virtuoso, the Pcell submaster might appear to have incorrect contacts. To resolve the contact mismatch and to allow abutment, open the design in Layout XL, discard the edits, and re-read the design from disk.
Related Topics
Return to top