• 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. Design migration tool

Stats

  • Locked Locked
  • Replies 21
  • Subscribers 125
  • Views 38574
  • 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

Design migration tool

Faizan UL HAQ
Faizan UL HAQ over 10 years ago

Hi,

I have a problem to transfer the simulation files from one design kit to another design kit in cadence virtuoso. The simulation files and circuit diagrams are quite many and it will take ages for me if i tranfer the files manually. Is there any kind of tool which can convert one design kit circuit diagrams into another design kit circuit diagrams.
BR

  • Cancel
Parents
  • Andrew Beckett
    Andrew Beckett over 10 years ago

    First of all, the second argument to the function is a cellView ID not a string. So you'd need to do either:

    cvId=geGetEditCellView()

    if the design is open for edit in the current window, or:

    cvId=dbOpenCellViewByType("mylib" "mycell" "myview" "schematic" "a") ; the fourth argument would be "maskLayout" if it's a layout view

    and then pass cvId as the second argument.

    In the above example, you have "fixIt" included (which was in my example in the comments at the top). This means you have to define a function called fixIt which takes three arguments which does any  more complex corrections to the parameter. See the comments for more details.

    The propMatch property in the config is a way of limiting the match to only when there is a particular property on the instance with a particular value. These can be speciifed this way:

    propMatch (("w" "1.0u") ("fingers" "1"))

    If you do that, then the conversion would only be done if there is a property called w with value 1.0u, and fingers with value 1 (this is a silly example).

    If you need more complex matching, you can write a custom SKILL function which takes the instance Id of the instance being checked and returns t/nil to indicate whether this is a device you want to convert, and then reference this function name using matchFunction.

    matchFunction MyDoesItMatch

    and then in SKILL you'd define:

    procedure(MyDoesItMatch(instId)
      when(instId~>w=="1.0u" && instId~>fingers=="1"
         t
      )
    )

    for example.

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • seanhuang
    seanhuang over 6 years ago in reply to Andrew Beckett

    Hi Andrew,

    I tried to use your skill code to convert one cell from TSMC 0.18um to TSMC 0.13um (Actually I just want to modify parameter "l" from 0.18um to 0.13um), but I got the following error:

    *WARNING* (DB-2700211): dbOpenCellViewByType: Failed to open cellview (inv_x1 symbol) from lib (newlib) in 'r' mode because cellview does not exist, or cellview type is not recognized by dbOpenCellViewByType.

    Also, could you please help with fixIt if I want to modify only parameter "l" from 0.18um to 0.13um? Thanks!

    My original library (mylib, TSMC 0.18) with original cell inv_x1 (symbol & schmatic), and I want to convert it to a complete new library (newlib, TSMC 0.13) with new cell. Here is my conv.config:

    (
      (nil
       fromLib   "mylib"
       fromCell  "inv_x1"
       toLib     "newlib"
       toCell    "inv_x1"
       runCallbacks t
       params (
               ("w" "width")
               ("l" "length" fixIt)
               )
       addProps (
                 ("isnoisy" t)
                 )
       )
      (nil
       fromLib   "mylib"
       fromCell  "inv_x1"
       toLib     "newlib"
       toCell    "inv_x1"
       propMatch (("subtype" "pxyz"))
       runCallbacks (?useInstCDF t ?callInitProc t)
       params (
               ("w" "width")
               ("l" "length")
               )
       )
    )
    
     
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 6 years ago in reply to seanhuang

    The fromCell and toCell are not supposed to be the name of the cell you're converting. They should be the names of the cells instantiated in your circuit that you need repacking - so I would expect it to be having fromLib "tsmc18" and toLib "tsmc13" (or whatever the libraries are called) and the fromCell and toCell would be (say) "nmos2v" or similar (whatever the transistors are called in the PDK). Most likely the parameter names (w, l etc) are the same in both PDKs and so do not need mapping.

    A fixIt function would probably be something like:

    procedure(fixMinimumLength(inst parName val)
      let((valAsNum)
        valAsNum=cdfParseFloatString(val)
        ; this just allows for rounding errors - it says if the value is close to 0.18u
        if(abs(valAsNum-0.18u)<1n  then
          "0.13u"
        else
          val
        )
      )
    )

    You'd specify this for the l parameter only in the params section. So something like:

    (nil
      fromLib "tsmc18"
      fromCell "nmos1v"
      toLib "tsmc13"
      toCell "nmos1v"
      runCallbacks t
      params (
        ("l" "l" fixMinimumLength)
      )
    )

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • seanhuang
    seanhuang over 6 years ago in reply to Andrew Beckett

    Hi Andrew,

    With your help, I could modify "l" successfully, but "w" is not correct, no matter whether I add ("w" "lFinger Width") in conv.config. It seems that it only transferred the original w value into "User Property" instead of "CDF Parameter": As you can see the attached snapshot, Finger Width in "User Property" is right (600n), but in "CDF Parameter" it's always "2u". Is there any way to change "Finger Width" of "CDF Parameter"? Thanks!

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 6 years ago in reply to seanhuang

    You are not giving the correct destination parameter name - you’ve used the prompt that is shown on the form rather than the parameter name, which is why it is creating user defined properties (for Length as well). You need to do Tools->CDF->Edit and then look at what each property name is and use those instead. 

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • seanhuang
    seanhuang over 6 years ago in reply to Andrew Beckett

    Hi Andrew, sorry to trouble you again: With your help I could do successful migration, but when I copy the whole environment to my another workstation, it even couldn't execute the command (everything is same except different workstation). Please help to look at the snapshot and help me. Thanks so much!

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 6 years ago in reply to seanhuang

    This is indicating that it couldn’t open the file conv.config. That’s either because you didn’t have the permissions but looking at the fact that a full path worked it’s more likely to be because the SKILL path doesn’t include the working dir. Check what:

    getSkillPath()

    returns. Does it include “.”? If not, you can either give the path as “./conv.config” or use:

    setSkillPath(cons(“.” getSkillPath()))

    before running the abConv... function

    Regards,

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • seanhuang
    seanhuang over 6 years ago in reply to Andrew Beckett

    Hi Andrew, You are brilliant! Please help me for the last issue: Most transistor's length is "180n" as the string, but I encountered one transistor is "400n" which showed as the number "4e-07" in SKILL (As you can see from the snapshot). However when I manually change from 400n to 400.0n (or any other number) in Object Properties, the SKILL will recognize it as the string instead of the number. It's so strange! Thanks a lot!

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Reply
  • seanhuang
    seanhuang over 6 years ago in reply to Andrew Beckett

    Hi Andrew, You are brilliant! Please help me for the last issue: Most transistor's length is "180n" as the string, but I encountered one transistor is "400n" which showed as the number "4e-07" in SKILL (As you can see from the snapshot). However when I manually change from 400n to 400.0n (or any other number) in Object Properties, the SKILL will recognize it as the string instead of the number. It's so strange! Thanks a lot!

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
Children
  • Andrew Beckett
    Andrew Beckett over 6 years ago in reply to seanhuang

    Inside the fixing function (where you have the printf) you can put:

    if(numberp(val) then

      valAsNum=val

    else

      valAsNum=cdfParseFloatString...

    )

    I’m writing this on a mobile device so the cdfParseFloatString in the else branch is the line that’s already in the code. 

    Regards,

    Andrew

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • seanhuang
    seanhuang over 6 years ago in reply to Andrew Beckett

    You are so helpful, Andrew! Now everything works perfectly!Thank you so much!

    • 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