Product Documentation
Virtuoso Layout Suite SKILL Reference
Product Version IC23.1, November 2023

spdRegUserFlowProc

spdRegUserFlowProc(
[ ?postGen t_postGenProc ]
[ ?preGen t_preGenProc ]
[ ?postGenLayout t_postGenLayProc ]
[ ?symPreviewInstParam t_symPreviewInstParamProc ] 
)
=> t / nil

Description

Registers user-defined callbacks to further customize the design in specific steps of the SPD flow.

Arguments

?postGen t_postGenProc

  

The user callback to postprocess real devices after placement in the SPD Preview window. For example, enable the dummy poly shapes only on the outer-most source or drain in a row.

userPostGenProc(
d_cellview 
l_instRows 
l_stackedInsts
[ r_cxtObj ]
) 
=> t / nil 

where,

  • d_cellview is the database ID of the cellview displayed in the SPD Preview window.
  • l_instRows is a list of real devices placed in the rows with the following syntax:
     l_instRows = list( l_row1 l_row2 ...) 
;from bottom to top 
l_row = list( l_chain1 l_chain2 … ) 
;device chains in each row; 
l_chain = list( d_inst1 d_inst2 … ) 
;database IDs of the instances in each device chain; 

  

  • l_stackedInsts is a list of database IDs of the stacked real devices.

  

  • r_cxtObj is an object that retrieves additional information related to the design open in SPD through the preview cellview process with the following syntax:
     cxtObj~>powerRails
cxtObj~>signalTracks
cxtObj~>inst~>rows
cxtObj~>inst~>stacked
cxtObj~>ref~>topOdY, bottomOdY, centerY
     rowX {start, end} 
cxtObj~>setting~>trunkWidth, trunkOdSpc, trunkSpc, rowPairSpc

where,

    • cxtObj~>powerRails is a list of power and ground shapes.

  

    • cxtObj~>signalTracks is list of trunks created by SPD. list(l_channel1 l_channel2)
      where, l_channel is list(l_track1 l_track2 l_track3…)
      where, l_track is list(l_trunk1 l_trunk2 …)

  

    • cxtObj~>inst~>rows is a list of real devices placed in rows that follow the row pattern from bottom to top. list( l_row1 l_row2 ...)
      where, l_row is list( l_chain1 l_chain2 … ) | nil Device chains in each row or nil if the row is empty.
      where, l_chain is list( inst1 inst2 … ) | inst Instances in each device chain or a single instance.

  

    • cxtObj~>inst~>stacked is a list of stacked real devices if device stacking is used
    • cxtObj~>ref~>topOdY, bottomOdY, centerY rowX{start, end} where,
      • topOdY is the topmost oxide edge of all instances.
      • bottomOdY is the lowest oxide edge of all instances.
      • centerY is the middle of oxide edge of row pairs.
      • rowX is the leftmost and rightmost oxide edge of each row.

  

    • cxtObj~>setting~>trunkWidth, trunkOdSpc, trunkSpc, rowPairSpc where,
      • trunkWidth specifies the width of the trunk.
      • trunkOdSpc specifies spacing between oxide and trunk.
      • trunkSpc specifies spacing between the trunks.
    • rowPairSpc specifies a list of within row pair spacing values and between row pair spacing values.

t_preGenProc

The user callback to preprocess real devices in the SPD Preview window before placement. For example, remove unwanted layers from the device.

userPreGenProc(
d_cellview
) 
=> t / nil

where,

  • d_cellview is the database ID of the cellview displayed in the SPD Preview window.

?postGenLayout t_postGenLayProc

The user callback to post-process the SPD result after the design is placed in the target layout. For example, MakeCell or add to FigGroup.

Default is nil.

userPostGenLayoutProc(
d_cellView 
l_objs 
[ r_genLayCxt ]
) 
=> t / nil

Where

  • d_cellview is the cellview ID of the target layout where SPD generates real devices.
  • l_objs is a list of all objects generated from SPD. For example, instances, power rails, and signal tracks.
  • r_genLayCxt is a context object that contains additional genLayout information with the following syntax:
    cxtPostGenLayoutObj~>otherClone 
    Allows launching SPD from one clone group. This options filters out the following:
    • More than one clone groups.
    • One clone group and other instances. In this case, only the instances are opened in SPD.
    • Other fig groups.

See Example 2 for more information.

?symPreviewInstParam t_symPreviewInstParamProc

The user callback that specifies device size on the SPD gate size previewer.

userSymPreviewInstParamProc(
d_instance
)
    => DPL 

Where

  • d_instance is the database ID of an SPD instance on the SPD gate size previewer

The callback returns the disembodied property list that contains the following fields to represent device display size on the SPD gate size previewer.

  • f_fingerWidth
  • f_length
  • x_fingerCount

See Example 3 for more information.

Value Returned

t

The user flow callback is registered successfully.

nil

The user flow callback cannot be registered. The current registration must be unregistered before a new one can be registered.

Examples

Example 1

Specify MyPostGenProc cellname as ABPlusCDBar2

#PowerRails's Net: ("gnd!" "vcc!")
#Ref: (topOdY 1.55 bottomOdY 0.1 centerY (0.75) rowX ((0.07 1.85) (0.07 2.05)))
#Setting: (trunkWidth 0.06 trunkOdSpc 0.06 trunkSpc 0.06 rowPairSpc (1.0 1.0))
#Stacked Instances: nil
#Find 2 tracks from 1 channel
Net:net037 (((0.3275 0.43) (0.4375 0.49)))
Net:net036 (((0.5325 0.43) (0.6425 0.49)))
Net:D (((1.3675 0.43) (1.4775 0.49)))
Net:A (((1.5725 0.43) (1.6825 0.49)))
#Find 1 chain from 2 rows

PM6[MY]--PM4--PM5--PM7[MY]

procedure( MyPostGenProc( d_cellview l_inst_rRows l_stacked_iInsts @optional cxtObj)
  let( ()
    info("Enter MyPostGenProc: CellName:%s\n" d_cellview~>cellName)
    info("#PowerRails's Net: %L\n",cxtObj~>powerRails~>net~>name) 
    info("#Ref: %L\n",cxtObj~>ref~>??)
    info("#Setting: %L\n",cxtObj~>setting~>??)
    info("#Stacked Instances: %L\n",cxtObj~>inst~>stacked~>name)
    
    ;Print the information at the second track of first channel.
    MyGetTrackData(cxtObj->signalTracks 1 2)
    ;Print the information at the first chain of second row. 
    MyGetInstData(cxtObj->inst 2 1) 
  )
);MyPostGenProc
procedure(MyGetTrackData(signalTracks numOfChannel numOfTrack)
  let( (trackList track)
    info("#Find %x track from %x channel\n" numOfTrack numOfChannel)
    ;Get trackList from specified channel
    trackList = nth(numOfChannel-1 signalTracks)
    ;Get track from trackList
    track = nth(numOfTrack-1 trackList)
    ;Print net name
    foreach(trunk track
      info("Net:%s (%L)\n" trunk~>net~>name trunk~>bBox)
    )
    
  );let   
);MyGetTrackData
procedure(MyGetInstData(instObj numOfRow numOfChain )
  let( (row chain pre)
    info("#Find the %x chain from %x row\n" numOfChain numOfRow);
    ;Get the specified row
    row = nth(numOfRow-1 instObj->rows)
    ;Get the specified chain 
    chain = nth(numOfChain-1 row) 
    
    foreach(inst chain
      when(pre info("--"))
      info("%s" inst->name)
      when(inst~>orient != "R0"
        info("[%s]" inst~>orient)
      )
      pre = inst
    );inst
    
  ) ;let 
); MyGetInstData

Example 2

The following procedure is default callback for the clone group:

procedure( MyPostGenLayProc( cv objs @optional cxtObj ) 
  let( (figGroup figGroupList)
    info("Enter MyPostGenLayoutProc\n")
    when( length(cxtObj~>otherClone) > 0
      info("%d otherClones detected.\n",length(cxtObj~>otherClone))
      ;Delete Original Clone Family
      lxDeleteSynchronousCloneFamily(cxtObj~>otherClone)
      geDeselectAll(geGetCellViewWindow(cv))
      ;Create New Fig Group
      geSelectFigs(objs)
      leHiCreateGroup()
      figGroup = car(geGetSelectedSet())
      geDeselectAll(geGetCellViewWindow(cv))
      ;info("fig Group:%L, \n", figGroup) 
    ) ; when
  );let
);procudure
spdRegUserFlowProc(?postGenLayout "MyPostGenLayProc" )

Example 3

Specifies device size on each instance for the SPD gate size previewer.

procedure(MySymPreviewInstParam( inst )
info("MySymPreviewInstParam(%s)" inst->name)
let((ret)
ret = ncons(nil)
ret->fingerWidth    = 0.1 /* float */
ret->length         = 0.02 /* float */
ret->fingerCount    = 2 /*int*/
info("%L\n" ret)
ret
)
); => DPL
spdRegUserFlowProc(?symPreviewInstParam "MySymPreviewInstParam")

Return to top
 ⠀
X