• 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. How to add a menu item to the export in CIW

Stats

  • Locked Locked
  • Replies 12
  • Subscribers 143
  • Views 17765
  • 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

How to add a menu item to the export in CIW

venuuuuu
venuuuuu over 13 years ago

 hi all,

I need to add a menu item "Run GDS to Library" (Which writes out GDS files for all layout views in a library) to export in CIW.

Let me know how to do it .

  • Cancel
  • Andrew Beckett
    Andrew Beckett over 13 years ago

    The code still has numerous mistakes in it. The main ones are that you still had enterString rather than hiDisplayForm, and you still had references to the wrong variable name in the boundp() check. 

    You asked about the "need of" CCSchangeDirectory() in the code. Well, this function is not called - it's your code, so I have no idea why you wrote it. It's not used, and isn't necessary. CCSgdsDoneProc is also not used now that I've fixed the code to not use enterString (as I told you).

    An options form is one used with an "enter" function. These are for the forms which you bring up with the F3 key when digitizing points, etc. A normal (nonoptions) form is one displayed with hiDisplayForm and has OK/Cancel buttons (rather than Hide). This is covered in the documentation.

    Anyway, here's some corrected code (comments with "AB" in them to show where I made the main changes).

     

     procedure(gds()
      let( (form)
     ; AB - had the wrong variable name (CCSgdsForm rather than CCScelltoGdsForm)
     if(boundp('CCScelltoGdsForm) && CCScelltoGdsForm then
          form = CCScelltoGdsForm
        else
          form = CCScreategdsForm()
        ); if
        when(hiIsForm(form)
        
    /* AB - as I said before, don't use enterString but call hiDisplayForm
      enterString(
            ?prompts list("Enter rundirectory to gds ")
            ?form form
            ;?initProc t_initProcName
            ?doneProc "CCSgdsDoneProc"
            ;?formProc t_formProcName
            ?alwaysMap t
            ?cmdName "CCScelltoGdsForm"
    )
    */
       hiDisplayForm(form)
        ); when the form exists
      ); let
    ); procedure gds

    procedure(CCScreategdsForm()
       let( (rundirectory librarys library form )
    librarys=ddGetLibList()~>name
            library = hiCreateCyclicField(
              ?name 'library
              ?choices      librarys
              ?prompt       "Library"
              ?value        car(librarys)
          ; AB - don't think you need a callback (you've not defined one)
              ; ?callback     "CCSchangelibrary()"
    )
    rundirectory=hiCreateStringField(
    ?name 'rundirectory
    ?prompt "Rundirectory"
    ?value  ""
    ?defValue "."
    ); hiCreateStringField
     form = hiCreateAppForm(
              ?name 'CCScelltoGdsForm
              ?formTitle "Cell into GDS"
              ?formType     'nonoptions
              ?buttonLayout 'OKCancelApply
          ; AB - allowed a bit more space for the prompts
              ?fields list(list(library 0:0 200:30 100)
                    list(rundirectory 0:30 200:30 100) )
              ?callback "abWriteLibGDS1()"
            ); hiCreateAppForm
     
               
         ); let
    );procedure

     ; AB - this function does not appear to be used anywhere, so not sure why it's
     ; here.
     procedure(CCSchangeDirectory()
      let( (origRundirectory)
        when(boundp('CCScelltoGdsForm) && CCScelltoGdsForm
          origRundirectory= CCScelltoGdsForm->rundirectory->value
          CCScelltoGdsForm->rundirectory->value = origRundirectory
          unless(CCScelltoGdsForm->currentRundirectory == CCScelltoGdsForm->rundirectory->value
            CCScelltoGdsForm->currentRundirectory = CCScelltoGdsForm->rundirectory->value
          ); unless
          ;applyEnterFun(form)
        ); when the form exists
      ); let
    ); procedure CCSchangeMetBusWidth

    procedure(CCSgdsDoneProc( done )
      let( ( form )
        when(boundp('CCSgdsForm) && CCSgdsForm
          form   = CCSgdsForm
          if(done then
                form->currentRundirectory = nil
                  CCSgdsCB(
                 form->rundirectory~>value
                 )
           ); if done
        ); when form exists
      ); let
    ); procedure

    procedure(abWriteLibGDS1()
    /* abWriteLibGDS.il
     
    Author     A.D.Beckett
    Group      Custom IC (UK), Cadence Design Systems Ltd.
    Language   SKILL
    Date       Mar 05, 2002
    Modified 
    By       
     
    To use this, Save a template from the File->Export Stream form,
    which contains any layer maps etc that you want to use. Then
    you can run the code by doing:
     
    abWriteLibGDS("libName" "/path/to/template/file")
     
    ***************************************************
     
    SCCS Info: @(#) abWriteLibGDS.il 03/05/02.10:52:04 1.1
     
     
    /***************************************************************
    *                                                              *
    *     abWriteLibGDS(libName fileOrDPL [?viewName "layout"      *
    *                       ?suffix ".gds")                        *
    *                                                              *
    *    Writes out GDS files for all layout views in a library    *
    *                                                              *
    ***************************************************************/
     abWriteLibGDS(CCScelltoGdsForm->library->value "venus.il")
    )

    procedure(abWriteLibGDS(
        libName fileOrDPL @key (viewName "layout") (suffix ".gds")
        )
        let((streamOutKeys)
            if(stringp(fileOrDPL) && isFile(fileOrDPL) then
                loadi(fileOrDPL)
            else
                streamOutKeys=fileOrDPL
            ) ; if
            foreach(cell ddGetObj(libName)~>cells
                when(ddGetObj(libName cell~>name viewName "master.tag")
                    abWriteCellGDS(libName cell~>name viewName streamOutKeys suffix)
                ) ; when
            ) ; foreach
            t
        ) ; let
    ) ; procedure
     
    /*****************************************************************
    *                                                                *
    * abWriteCellGDS(libName cellName viewName streamOutKeys suffix) *
    *                                                                *
    *    Given the library, cell and view names, and a DPL of the    *
    *     template file data, the suffix to apply to the files,      *
    *    write out a stream file. This is done by creating a new     *
    *  template file, and invoking "pipo strmout", and waiting for   *
    *                          the results.                          *
    *                                                                *
    *****************************************************************/
     
    procedure(abWriteCellGDS(libName cellName viewName streamOutKeys suffix)
        let((template fileName ipcId)
            streamOutKeys->libName=libName
            streamOutKeys->primaryCell=cellName
            streamOutKeys->viewName=viewName
            streamOutKeys->outFile=strcat(cellName suffix)
            streamOutKeys->errFile=strcat("PIPO_" cellName ".LOG")
            printf("Writing GDS for %s/%s/%s to %s\n"
                libName cellName viewName
                streamOutKeys->outFile
            ) ; printf
            fileName=makeTempFileName("/tmp/writeCellGDS")
            template=outfile(fileName)
            fprintf(template "streamOutKeys='%L\n" streamOutKeys)
            close(template)
            ipcId=ipcBeginProcess(strcat("pipo strmout " fileName))
            ipcWait(ipcId)
            deleteFile(fileName)
        ) ; let
    ) ; procedure
     

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • venuuuuu
    venuuuuu over 13 years ago

     Thank you Andrew, It works now. 

    • 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