• 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 Design
  3. Stream out/LVS Error occurs with PCELL which is made by...

Stats

  • Replies 2
  • Subscribers 130
  • Views 292
  • Members are here 0

Stream out/LVS Error occurs with PCELL which is made by Skill Script and CDF Parameters

KO20251123107
KO20251123107 4 days ago

Hello, 

I tried to make pcell with skill script and additionally cdf parameters - it worked well. Pcell instance was created without any error.

However, when I put the pcell inside another normal instance and tried to excute LVS or strout, the error occured with message below.

ERROR (XSTRM-231): Pcell evaluation failed for 'MYLIBPATH/layout' because the Pcell SKILL code contains either a syntax error or an unsupported XStream function. Check the standard output or the Virtuoso log file for more information. Cadence recommends correcting the Pcell SKILL code to resolve the issue. However, to ignore these errors and continue the translation, you may use the '-ignorePcellEvalFail' option.

When I created pcell without cdfparams, the occur did not occur so I assumed CDF Functions in my skill code are problematic.

I found the way to solve this, and recognized that regarding unsupported function, I have to define the functions and put it inside the libinit.il file.

But, I don't know how to define cdf functions in that libinit.il. (ex, cdfGetBaseCellCDF, cdfDeleteCDF, cdfCreateParam ...)

So, I added my skill code below and want to ask two questions below : 

1) Does the error is really caused by cdf functions? 
2) How can I solve this occur? Do I have to make libinit file to define cdf functions? 

Thanks for any help!

Note : My skill code with cdf is

pcDefinePCell(
list(
ddGetObj("MYLIBNAME")
"MYCELLNAME"
"layout"
)
(
(CHANNEL_WIDTH_X float 1.0)
(GATE_LENGTH_Y float 0.13)
(GATE_EXTENSION_X float 0.050)
(GP_TAB_IN_ACT_X float 0.060)
)
let(
(
GATE_LENGTH_Y GATE_EXTENSION_X CHANNEL_WIDTH_X GP_TAB_IN_ACT_X

GATE_1EA_X1 GATE_1EA_Y1 GATE_1EA_X2 GATE_1EA_Y2 GATE_1EA_X3 GATE_1EA_Y3 GATE_1EA_X4 GATE_1EA_Y4
GATE_2EA_X1 GATE_2EA_Y1 GATE_2EA_X2 GATE_2EA_Y2 GATE_2EA_X3 GATE_2EA_Y3 GATE_2EA_X4 GATE_2EA_Y4
GATE_3EA_X1 GATE_3EA_Y1 GATE_3EA_X2 GATE_3EA_Y2 GATE_3EA_X3 GATE_3EA_Y3 GATE_3EA_X4 GATE_3EA_Y4
GATE_4EA_X1 GATE_4EA_Y1 GATE_4EA_X2 GATE_4EA_Y2 GATE_4EA_X3 GATE_4EA_Y3 GATE_4EA_X4 GATE_4EA_Y4

pcLayer pcPurpose pcInst pcParameters pcParamProp pcLib

cdfGetBaseCellCDF cdfDeleteCDF cdfCreateBaseCellCDF cdfCreateParam cdfSaveCDF

CDF_LIB CDF_CELL CDF_CELL_ID CDF_ID
)

CDF_LIB="MYLIBNAME" ;
CDF_CELL="MYCELLNAME" ;
unless( CDF_CELL_ID=ddGetObj(CDF_LIB CDF_CELL) error("Could not get cell %s." cell))
when( CDF_ID=cdfGetBaseCellCDF(CDF_CELL_ID) cdfDeleteCDF(CDF_ID))
CDF_ID=cdfCreateBaseCellCDF(CDF_CELL_ID) ;


cdfCreateParam(CDF_ID
?name "CHANNEL_WIDTH_X"
?prompt "CHANNEL_WIDTH_X"
?type "float"
?defValue 1.0
?display "t"
)

cdfCreateParam(CDF_ID
?name "GATE_LENGTH_Y"
?prompt "GATE_LENGTH_Y"
?type "float"
?defValue 0.13
?display "t"
)

cdfCreateParam(CDF_ID
?name "GATE_EXTENSION_X"
?prompt "GATE_EXTENSION_X"
?type "float"
?defValue 0.050
?display "t"
)

cdfCreateParam(CDF_ID
?name "GP_TAB_IN_ACT_X"
?prompt "GP_TAB_IN_ACT_X"
?type "float"
?defValue 0.060
?display "t"
)

cdfSaveCDF(CDF_ID)
)

(GATE_1EA_X1 = 0)
(GATE_1EA_Y1 = 0)
(GATE_1EA_X2 = GATE_1EA_X1 + 0)
(GATE_1EA_Y2 = GATE_1EA_Y1 + 0.1*GATE_LENGTH_Y)
(GATE_1EA_X3 = GATE_1EA_X2 + GATE_EXTENSION_X + GP_TAB_IN_ACT_X)
(GATE_1EA_Y3 = GATE_1EA_Y2 + 0)
(GATE_1EA_X4 = GATE_1EA_X3 - 0.1*GATE_LENGTH_Y)
(GATE_1EA_Y4 = GATE_1EA_Y3 - 0.1*GATE_LENGTH_Y)

(GATE_2EA_X1 = GATE_1EA_X2 + 0)
(GATE_2EA_Y1 = GATE_1EA_Y2 + GATE_LENGTH_Y)
(GATE_2EA_X2 = GATE_2EA_X1 + 0)
(GATE_2EA_Y2 = GATE_2EA_Y1 + 0.1*GATE_LENGTH_Y)
(GATE_2EA_X3 = GATE_2EA_X2 + GATE_EXTENSION_X + GP_TAB_IN_ACT_X - 0.1*GATE_LENGTH_Y)
(GATE_2EA_Y3 = GATE_2EA_Y2 + 0)
(GATE_2EA_X4 = GATE_2EA_X3 + 0.1*GATE_LENGTH_Y)
(GATE_2EA_Y4 = GATE_2EA_Y3 - 0.1*GATE_LENGTH_Y)

(GATE_3EA_X1 = GATE_2EA_X4 + (CHANNEL_WIDTH_X - 2*GP_TAB_IN_ACT_X))
(GATE_3EA_Y1 = GATE_2EA_Y4 + 0)
(GATE_3EA_X2 = GATE_3EA_X1 + 0.1*GATE_LENGTH_Y)
(GATE_3EA_Y2 = GATE_3EA_Y1 + 0.1*GATE_LENGTH_Y)
(GATE_3EA_X3 = GATE_3EA_X2 + GATE_EXTENSION_X + GP_TAB_IN_ACT_X - 0.1*GATE_LENGTH_Y)
(GATE_3EA_Y3 = GATE_3EA_Y2 + 0)
(GATE_3EA_X4 = GATE_3EA_X3 + 0)
(GATE_3EA_Y4 = GATE_3EA_Y3 - 0.1*GATE_LENGTH_Y)

(GATE_4EA_X1 = GATE_3EA_X2 + 0)
(GATE_4EA_Y1 = 0)
(GATE_4EA_X2 = GATE_4EA_X1 - 0.1*GATE_LENGTH_Y)
(GATE_4EA_Y2 = GATE_4EA_Y1 + 0.1*GATE_LENGTH_Y)
(GATE_4EA_X3 = GATE_4EA_X2 + GATE_EXTENSION_X + GP_TAB_IN_ACT_X)
(GATE_4EA_Y3 = GATE_4EA_Y2 + 0)
(GATE_4EA_X4 = GATE_4EA_X3 + 0)
(GATE_4EA_Y4 = GATE_4EA_Y3 - 0.1*GATE_LENGTH_Y)


(pcLayer = 20)
(pcPurpose = "drawing")
(pcInst = (dbCreatePolygon pcCellView
list(pcLayer pcPurpose)
list(GATE_1EA_X1:GATE_1EA_Y1 GATE_1EA_X2:GATE_1EA_Y2 GATE_1EA_X3:GATE_1EA_Y3 GATE_1EA_X4:GATE_1EA_Y4)
))

(pcLayer = 20)
(pcPurpose = "drawing")
(pcInst = (dbCreatePolygon pcCellView
list(pcLayer pcPurpose)
list(GATE_2EA_X1:GATE_2EA_Y1 GATE_2EA_X2:GATE_2EA_Y2 GATE_2EA_X3:GATE_2EA_Y3 GATE_2EA_X4:GATE_2EA_Y4)
))

(pcLayer = 20)
(pcPurpose = "drawing")
(pcInst = (dbCreatePolygon pcCellView
list(pcLayer pcPurpose)
list(GATE_3EA_X1:GATE_3EA_Y1 GATE_3EA_X2:GATE_3EA_Y2 GATE_3EA_X3:GATE_3EA_Y3 GATE_3EA_X4:GATE_3EA_Y4)
))

(pcLayer = 20)
(pcPurpose = "drawing")
(pcInst = (dbCreatePolygon pcCellView
list(pcLayer pcPurpose)
list(GATE_4EA_X1:GATE_4EA_Y1 GATE_4EA_X2:GATE_4EA_Y2 GATE_4EA_X3:GATE_4EA_Y3 GATE_4EA_X4:GATE_4EA_Y4)
))
)

 

  • Cancel
  • Sign in to reply
  • Andrew Beckett
    Andrew Beckett 4 days ago

    Several things wrong here:

    1. It makes no sense to create the CDF within the PCell code itself (otherwise it would try to create it every time the PCell evaluated) - and anyway the CDF creation functions are not available in the steam out or dbAccess executables
    2. You have put the CDF functions in the let (which is pointless and does nothing)
    3. You have the PCell parameter names in the let (which would mask them ordinarily; in this case your PCell code is outside of the let so it is not actually using the local variables but creating global variables)

    I moved the CDF creation outside of the PCell code, fixed the local variables, put the main code for the PCell inside the let, and reformatted the code to make it easier to read. It now runs and succeeds in stream out (in my limited tests). Note you'll need to change the lib and cell names back (I altered them for my testing):

    pcDefinePCell(list(ddGetObj("play45") "forumPCell" "layout")
       ((CHANNEL_WIDTH_X float 1.0)
        (GATE_LENGTH_Y float 0.13)
        (GATE_EXTENSION_X float 0.05)
        (GP_TAB_IN_ACT_X float 0.06)
       )
      ; don't define the PCell parameters in the let - otherwise you mask them
      let((
           GATE_1EA_X1 GATE_1EA_Y1 GATE_1EA_X2 GATE_1EA_Y2 GATE_1EA_X3 GATE_1EA_Y3 GATE_1EA_X4 GATE_1EA_Y4
           GATE_2EA_X1 GATE_2EA_Y1 GATE_2EA_X2 GATE_2EA_Y2 GATE_2EA_X3 GATE_2EA_Y3 GATE_2EA_X4 GATE_2EA_Y4
           GATE_3EA_X1 GATE_3EA_Y1 GATE_3EA_X2 GATE_3EA_Y2 GATE_3EA_X3 GATE_3EA_Y3 GATE_3EA_X4 GATE_3EA_Y4
           GATE_4EA_X1 GATE_4EA_Y1 GATE_4EA_X2 GATE_4EA_Y2 GATE_4EA_X3 GATE_4EA_Y3 GATE_4EA_X4 GATE_4EA_Y4
           
           pcLayer pcPurpose pcInst pcParameters pcParamProp pcLib
          )
      ; ensure the PCell code is within the let (it wasn't before)
      GATE_1EA_X1 = 0
      GATE_1EA_Y1 = 0
      GATE_1EA_X2 = GATE_1EA_X1 + 0
      GATE_1EA_Y2 = GATE_1EA_Y1 + (0.1 * GATE_LENGTH_Y)
      GATE_1EA_X3 = GATE_1EA_X2 + GATE_EXTENSION_X + GP_TAB_IN_ACT_X
      GATE_1EA_Y3 = GATE_1EA_Y2 + 0
      GATE_1EA_X4 = GATE_1EA_X3 - (0.1 * GATE_LENGTH_Y)
      GATE_1EA_Y4 = GATE_1EA_Y3 - (0.1 * GATE_LENGTH_Y)
      
      GATE_2EA_X1 = GATE_1EA_X2 + 0
      GATE_2EA_Y1 = GATE_1EA_Y2 + GATE_LENGTH_Y
      GATE_2EA_X2 = GATE_2EA_X1 + 0
      GATE_2EA_Y2 = GATE_2EA_Y1 + (0.1 * GATE_LENGTH_Y)
      GATE_2EA_X3 = (GATE_2EA_X2 + GATE_EXTENSION_X + GP_TAB_IN_ACT_X) - (0.1 * GATE_LENGTH_Y)
      GATE_2EA_Y3 = GATE_2EA_Y2 + 0
      GATE_2EA_X4 = GATE_2EA_X3 + (0.1 * GATE_LENGTH_Y)
      GATE_2EA_Y4 = GATE_2EA_Y3 - (0.1 * GATE_LENGTH_Y)
      
      GATE_3EA_X1 = GATE_2EA_X4 + (CHANNEL_WIDTH_X - (2 * GP_TAB_IN_ACT_X))
      GATE_3EA_Y1 = GATE_2EA_Y4 + 0
      GATE_3EA_X2 = GATE_3EA_X1 + (0.1 * GATE_LENGTH_Y)
      GATE_3EA_Y2 = GATE_3EA_Y1 + (0.1 * GATE_LENGTH_Y)
      GATE_3EA_X3 = (GATE_3EA_X2 + GATE_EXTENSION_X + GP_TAB_IN_ACT_X) - (0.1 * GATE_LENGTH_Y)
      GATE_3EA_Y3 = GATE_3EA_Y2 + 0
      GATE_3EA_X4 = GATE_3EA_X3 + 0
      GATE_3EA_Y4 = GATE_3EA_Y3 - (0.1 * GATE_LENGTH_Y)
      
      GATE_4EA_X1 = GATE_3EA_X2 + 0
      GATE_4EA_Y1 = 0
      GATE_4EA_X2 = GATE_4EA_X1 - (0.1 * GATE_LENGTH_Y)
      GATE_4EA_Y2 = GATE_4EA_Y1 + (0.1 * GATE_LENGTH_Y)
      GATE_4EA_X3 = GATE_4EA_X2 + GATE_EXTENSION_X + GP_TAB_IN_ACT_X
      GATE_4EA_Y3 = GATE_4EA_Y2 + 0
      GATE_4EA_X4 = GATE_4EA_X3 + 0
      GATE_4EA_Y4 = GATE_4EA_Y3 - (0.1 * GATE_LENGTH_Y)
      
      
      pcLayer = 20
      pcPurpose = "drawing"
      pcInst = dbCreatePolygon(pcCellView
                               list(pcLayer pcPurpose)
                               list(
                                GATE_1EA_X1:GATE_1EA_Y1
                                GATE_1EA_X2:GATE_1EA_Y2
                                GATE_1EA_X3:GATE_1EA_Y3
                                GATE_1EA_X4:GATE_1EA_Y4
                               )
                              )
      
      pcLayer = 20
      pcPurpose = "drawing"
      pcInst = dbCreatePolygon(pcCellView
                               list(pcLayer pcPurpose)
                               list(
                                GATE_2EA_X1:GATE_2EA_Y1
                                GATE_2EA_X2:GATE_2EA_Y2
                                GATE_2EA_X3:GATE_2EA_Y3
                                GATE_2EA_X4:GATE_2EA_Y4
                               )
                              )
      
      pcLayer = 20
      pcPurpose = "drawing"
      pcInst = dbCreatePolygon(pcCellView
                               list(pcLayer pcPurpose)
                               list(
                                GATE_3EA_X1:GATE_3EA_Y1
                                GATE_3EA_X2:GATE_3EA_Y2
                                GATE_3EA_X3:GATE_3EA_Y3
                                GATE_3EA_X4:GATE_3EA_Y4
                               )
                              )
      
      pcLayer = 20
      pcPurpose = "drawing"
      pcInst = dbCreatePolygon(pcCellView
                               list(pcLayer pcPurpose)
                               list(
                                GATE_4EA_X1:GATE_4EA_Y1
                                GATE_4EA_X2:GATE_4EA_Y2
                                GATE_4EA_X3:GATE_4EA_Y3
                                GATE_4EA_X4:GATE_4EA_Y4
                               )
                              )
     )
    )
    
    
    
    ;; Create the CDF outside of the PCell
    let((
           CDF_LIB
           CDF_CELL
           CDF_CELL_ID
           CDF_ID
          )
        
        CDF_LIB = "play45" ;
        CDF_CELL = "forumPCell" ;
        unless(CDF_CELL_ID = ddGetObj(CDF_LIB CDF_CELL)
          error("Could not get cell %s." cell)
         )
        when(CDF_ID = cdfGetBaseCellCDF(CDF_CELL_ID)
          cdfDeleteCDF(CDF_ID)
         )
        CDF_ID = cdfCreateBaseCellCDF(CDF_CELL_ID) ;
        
        
        cdfCreateParam(CDF_ID
                       ?name "CHANNEL_WIDTH_X"
                       ?prompt "CHANNEL_WIDTH_X"
                       ?type "float"
                       ?defValue 1.0
                       ?display "t"
                      )
        
        cdfCreateParam(CDF_ID
                       ?name "GATE_LENGTH_Y"
                       ?prompt "GATE_LENGTH_Y"
                       ?type "float"
                       ?defValue 0.13
                       ?display "t"
                      )
        
        cdfCreateParam(CDF_ID
                       ?name "GATE_EXTENSION_X"
                       ?prompt "GATE_EXTENSION_X"
                       ?type "float"
                       ?defValue 0.05
                       ?display "t"
                      )
        
        cdfCreateParam(CDF_ID
                       ?name "GP_TAB_IN_ACT_X"
                       ?prompt "GP_TAB_IN_ACT_X"
                       ?type "float"
                       ?defValue 0.06
                       ?display "t"
                      )
        
        cdfSaveCDF(CDF_ID)
       )
    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • KO20251123107
    KO20251123107 3 days ago in reply to Andrew Beckett

    Hello, I applied your solution and now it works well. I really appreciate your help!

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • 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